//----------------------------------------------------------
// Copyright (C) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------
// MicrosoftAjax.js
Function.__typeName="Function";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function._validateParams=function(e,c){var a;a=Function._validateParameterCount(e,c);if(a){a.popStackFrame();return a}for(var b=0;b<e.length;b++){var d=c[Math.min(b,c.length-1)],f=d.name;if(d.parameterArray)f+="["+(b-c.length+1)+"]";a=Function._validateParameter(e[b],d,f);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(e,a){var c=a.length,d=0;for(var b=0;b<a.length;b++)if(a[b].parameterArray)c=Number.MAX_VALUE;else if(!a[b].optional)d++;if(e.length<d||e.length>c){var f=Error.parameterCount();f.popStackFrame();return f}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!=="undefined"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+"["+d+"]");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a;if(typeof b==="undefined")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!=="number"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(var g in e)if(e[g]===b)return null}else{var i=b;for(var g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&b!==window&&b!==document&&!(window.HTMLElement&&b instanceof HTMLElement)&&typeof b.nodeName!=="string"){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!c.isInstanceOfType(b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName="Error";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b="Sys.ArgumentException: "+(c?c:Sys.Res.argument);if(a)b+="\n"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:"Sys.ArgumentException",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b="Sys.ArgumentNullException: "+(c?c:Sys.Res.argumentNull);if(a)b+="\n"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:"Sys.ArgumentNullException",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b="Sys.ArgumentOutOfRangeException: "+(d?d:Sys.Res.argumentOutOfRange);if(c)b+="\n"+String.format(Sys.Res.paramName,c);if(typeof a!=="undefined"&&a!==null)b+="\n"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:"Sys.ArgumentOutOfRangeException",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a="Sys.ArgumentTypeException: ";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+="\n"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:"Sys.ArgumentTypeException",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b="Sys.ArgumentUndefinedException: "+(c?c:Sys.Res.argumentUndefined);if(a)b+="\n"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:"Sys.ArgumentUndefinedException",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c="Sys.FormatException: "+(a?a:Sys.Res.format),b=Error.create(c,{name:"Sys.FormatException"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c="Sys.InvalidOperationException: "+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:"Sys.InvalidOperationException"});b.popStackFrame();return b};Error.notImplemented=function(a){var c="Sys.NotImplementedException: "+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:"Sys.NotImplementedException"});b.popStackFrame();return b};Error.parameterCount=function(a){var c="Sys.ParameterCountException: "+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:"Sys.ParameterCountException"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack==="undefined"||this.stack===null||typeof this.fileName==="undefined"||this.fileName===null||typeof this.lineNumber==="undefined"||this.lineNumber===null)return;var a=this.stack.split("\n"),c=a[0],e=this.fileName+":"+this.lineNumber;while(typeof c!=="undefined"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d==="undefined"||d===null)return;var b=d.match(/@(.*):(\d+)$/);if(typeof b==="undefined"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join("\n")};if(!window)this.window=this;window.Type=Function;window.__rootNamespaces=[];window.__registeredTypes={};Type.prototype.callBaseMethod=function(a,d,b){var c=this.getBaseMethod(a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(d,c){var b=this.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Type.prototype.getBaseType=function(){return typeof this.__baseType==="undefined"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName==="undefined"?"":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!=="undefined")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a==="undefined"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(b){if(typeof b==="undefined"||b===null)return false;if(b instanceof this)return true;var a=Object.getType(b);return !!(a===this)||a.inheritsFrom&&a.inheritsFrom(this)||a.implementsInterface&&a.implementsInterface(this)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}if(!window.__classes)window.__classes={};window.__classes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2;a<arguments.length;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(window.__rootNamespaces)};Type.isClass=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){if(!window.__classes)return null;fn=window.__classes[ns.getName().toUpperCase()+"."+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(f){var d=window,c=f.split(".");for(var b=0;b<c.length;b++){var e=c[b],a=d[e];if(!a){a=d[e]={};if(b===0)window.__rootNamespaces[window.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(".");a.getName=function(){return this.__typeName}}d=a}};Object.__typeName="Object";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!=="function"||!a.__typeName||a.__typeName==="Object")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};Boolean.__typeName="Boolean";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a==="false")return false;if(a==="true")return true};Date.__typeName="Date";Date.__class=true;Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case "'":if(a)b.append("'");else d++;a=false;break;case "\\":if(a)b.append("\\");a=!a;break;default:b.append(f);a=false;break}}return d};Date._expandFormat=function(a,b){if(!b)b="F";if(b.length===1)switch(b){case "d":return a.ShortDatePattern;case "D":return a.LongDatePattern;case "t":return a.ShortTimePattern;case "T":return a.LongTimePattern;case "F":return a.FullDateTimePattern;case "M":case "m":return a.MonthDayPattern;case "s":return a.SortableDateTimePattern;case "Y":case "y":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}return b};Date._expandYear=function(c,a){if(a<100){var b=(new Date).getFullYear();a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)return a-100}return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g,"\\\\$1");var a=new Sys.StringBuilder("^"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case "dddd":case "ddd":case "MMMM":case "MMM":a.append("(\\D+)");break;case "tt":case "t":a.append("(\\D*)");break;case "yyyy":a.append("(\\d{4})");break;case "fff":a.append("(\\d{3})");break;case "ff":a.append("(\\d{2})");break;case "f":a.append("(\\d)");break;case "dd":case "d":case "MM":case "M":case "yy":case "y":case "HH":case "H":case "hh":case "h":case "mm":case "m":case "ss":case "s":a.append("(\\d\\d?)");break;case "zzz":a.append("([+-]?\\d\\d?:\\d{2})");break;case "zz":case "z":a.append("([+-]?\\d\\d?)");break}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append("$");var k=a.toString().replace(/\s+/g,"\\s+"),g={"regExp":k,"groups":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(g,c,h){var e=false;for(var a=1,i=h.length;a<i;a++){var f=h[a];if(f){e=true;var b=Date._parseExact(g,f,c);if(b)return b}}if(!e){var d=c._getDateTimeFormats();for(var a=0,i=d.length;a<i;a++){var b=Date._parseExact(g,d[a],c);if(b)return b}}return null};Date._parseExact=function(s,y,j){s=s.trim();var m=j.dateTimeFormat,v=Date._getParseRegExp(m,y),x=(new RegExp(v.regExp)).exec(s);if(x!==null){var w=v.groups,f=null,c=null,h=null,g=null,d=0,n=0,o=0,e=0,k=null,r=false;for(var p=0,z=w.length;p<z;p++){var a=x[p+1];if(a)switch(w[p]){case "dd":case "d":h=Date._parseInt(a);if(h<1||h>31)return null;break;case "MMMM":c=j._getMonthIndex(a);if(c<0||c>11)return null;break;case "MMM":c=j._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case "M":case "MM":var c=Date._parseInt(a)-1;if(c<0||c>11)return null;break;case "y":case "yy":f=Date._expandYear(m,Date._parseInt(a));if(f<0||f>9999)return null;break;case "yyyy":f=Date._parseInt(a);if(f<0||f>9999)return null;break;case "h":case "hh":d=Date._parseInt(a);if(d===12)d=0;if(d<0||d>11)return null;break;case "H":case "HH":d=Date._parseInt(a);if(d<0||d>23)return null;break;case "m":case "mm":n=Date._parseInt(a);if(n<0||n>59)return null;break;case "s":case "ss":o=Date._parseInt(a);if(o<0||o>59)return null;break;case "tt":case "t":var u=a.toUpperCase();r=u===m.PMDesignator.toUpperCase();if(!r&&u!==m.AMDesignator.toUpperCase())return null;break;case "f":e=Date._parseInt(a)*100;if(e<0||e>999)return null;break;case "ff":e=Date._parseInt(a)*10;if(e<0||e>999)return null;break;case "fff":e=Date._parseInt(a);if(e<0||e>999)return null;break;case "dddd":g=j._getDayIndex(a);if(g<0||g>6)return null;break;case "ddd":g=j._getAbbrDayIndex(a);if(g<0||g>6)return null;break;case "zzz":var q=a.split(/:/);if(q.length!==2)return null;var i=Date._parseInt(q[0]);if(i<-12||i>13)return null;var l=Date._parseInt(q[1]);if(l<0||l>59)return null;k=i*60+(a.startsWith("-")?-l:l);break;case "z":case "zz":var i=Date._parseInt(a);if(i<-12||i>13)return null;k=i*60;break}}var b=new Date;if(f===null)f=b.getFullYear();if(c===null)c=b.getMonth();if(h===null)h=b.getDate();b.setFullYear(f,c,h);if(b.getDate()!==h)return null;if(g!==null&&b.getDay()!==g)return null;if(r&&d<12)d+=12;b.setHours(d,n,o,e);if(k!==null){var t=b.getMinutes()-(k+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(t/60),t%60)}return b}};Date._parseInt=function(a){return parseInt(a.replace(/^[\s0]+(\d+)$/,"$1"))};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,h){if(!e||e.length===0||e==="i")if(h&&h.name.length>0)return this.toLocaleString();else return this.toString();var d=h.dateTimeFormat;e=Date._expandFormat(d,e);var a=new Sys.StringBuilder,b;function c(a){if(a<10)return "0"+a;return a.toString()}function g(a){if(a<10)return "00"+a;if(a<100)return "0"+a;return a.toString()}var j=0,i=Date._getTokenRegExp();for(;true;){var l=i.lastIndex,f=i.exec(e),k=e.slice(l,f?f.index:e.length);j+=Date._appendPreOrPostMatch(k,a);if(!f)break;if(j%2===1){a.append(f[0]);continue}switch(f[0]){case "dddd":a.append(d.DayNames[this.getDay()]);break;case "ddd":a.append(d.AbbreviatedDayNames[this.getDay()]);break;case "dd":a.append(c(this.getDate()));break;case "d":a.append(this.getDate());break;case "MMMM":a.append(d.MonthNames[this.getMonth()]);break;case "MMM":a.append(d.AbbreviatedMonthNames[this.getMonth()]);break;case "MM":a.append(c(this.getMonth()+1));break;case "M":a.append(this.getMonth()+1);break;case "yyyy":a.append(this.getFullYear());break;case "yy":a.append(c(this.getFullYear()%100));break;case "y":a.append(this.getFullYear()%100);break;case "hh":b=this.getHours()%12;if(b===0)b=12;a.append(c(b));break;case "h":b=this.getHours()%12;if(b===0)b=12;a.append(b);break;case "HH":a.append(c(this.getHours()));break;case "H":a.append(this.getHours());break;case "mm":a.append(c(this.getMinutes()));break;case "m":a.append(this.getMinutes());break;case "ss":a.append(c(this.getSeconds()));break;case "s":a.append(this.getSeconds());break;case "tt":a.append(this.getHours()<12?d.AMDesignator:d.PMDesignator);break;case "t":a.append((this.getHours()<12?d.AMDesignator:d.PMDesignator).charAt(0));break;case "f":a.append(g(this.getMilliseconds()).charAt(0));break;case "ff":a.append(g(this.getMilliseconds()).substr(0,2));break;case "fff":a.append(g(this.getMilliseconds()));break;case "z":b=this.getTimezoneOffset()/60;a.append((b>=0?"+":"-")+Math.floor(Math.abs(b)));break;case "zz":b=this.getTimezoneOffset()/60;a.append((b>=0?"+":"-")+c(Math.floor(Math.abs(b))));break;case "zzz":b=this.getTimezoneOffset()/60;a.append((b>=0?"+":"-")+c(Math.floor(Math.abs(b)))+d.TimeSeparator+c(Math.abs(this.getTimezoneOffset()%60)));break}}return a.toString()};Number.__typeName="Number";Number.__class=true;Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(g,f){var a=g.trim();if(a.match(/infinity/i)!==null)return parseFloat(a);if(a.match(/^0x[a-f0-9]+$/i)!==null)return parseInt(a);var d=f.numberFormat,b=d.NumberDecimalSeparator,c=d.NumberGroupSeparator,e=new RegExp("^[+-]?[\\d\\"+c+"]*\\"+b+"?\\d*([eE][+-]?\\d+)?$");if(!a.match(e))return Number.NaN;a=a.split(c).join("");a=a.replace(b,".");return parseFloat(a)};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(d,j){if(!d||d.length===0||d==="i")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var q=["n %","n%","%n"],p=["-n %","-n%","-%n"],r=["(n)","-n","- n","n-","n -"],o=["$n","n$","$ n","n $"],n=["($n)","-$n","$-n","$n-","(n$)","-n$","n-$","n$-","-n $","-$ n","n $-","$ n-","$ -n","n- $","($ n)","(n $)"];function i(p,k,j,l,o){var e=j[0],g=1,c=p.toString(),a="",m="",i=c.split(".");if(i.length>1){c=i[0];a=i[1];var h=a.split(/e/i);if(h.length>1){a=h[0];m="e"+h[1]}}if(k>0){var f=a.length-k;if(f>0)a=a.slice(0,k);else if(f<0)for(var n=0;n<Math.abs(f);n++)a+="0";a=o+a}else a="";a+=m;var b=c.length-1,d="";while(b>=0){if(e===0||e>b)if(d.length>0)return c.slice(0,b+1)+l+d+a;else return c.slice(0,b+1)+a;if(d.length>0)d=c.slice(b-e+1,b+1)+l+d;else d=c.slice(b-e+1,b+1);b-=e;if(g<j.length){e=j[g];g++}}return c.slice(0,b+1)+l+d+a}var a=j.numberFormat,e=Math.abs(this);if(!d)d="D";var b=-1;if(d.length>1)b=parseInt(d.slice(1));var c;switch(d.charAt(0)){case "d":case "D":c="n";if(b!==-1){var g=""+e,k=b-g.length;if(k>0)for(var m=0;m<k;m++)g="0"+g;e=g}if(this<0)e=-e;break;case "c":case "C":if(this<0)c=n[a.CurrencyNegativePattern];else c=o[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;e=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case "n":case "N":if(this<0)c=r[a.NumberNegativePattern];else c="n";if(b===-1)b=a.NumberDecimalDigits;e=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case "p":case "P":if(this<0)c=p[a.PercentNegativePattern];else c=q[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;e=i(Math.abs(this),b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var l=/n|\$|-|%/g,f="";for(;true;){var s=l.lastIndex,h=l.exec(c);f+=c.slice(s,h?h.index:c.length);if(!h)break;switch(h[0]){case "n":f+=e;break;case "$":f+=a.CurrencySymbol;break;case "-":f+=a.NegativeSign;break;case "%":f+=a.PercentSymbol;break}}return f};RegExp.__typeName="RegExp";RegExp.__class=true;Array.__typeName="Array";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Array.indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!=="undefined")e.call(d,c,a,b)}};Array.indexOf=function(d,e,a){if(typeof e==="undefined")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!=="undefined"&&d[b]===e)return b}return -1};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Array.indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};String.__typeName="String";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")};String.prototype.trimEnd=function(){return this.replace(/\s+$/,"")};String.prototype.trimStart=function(){return this.replace(/^\s+/,"")};String.format=function(){return String._toFormattedString(false,arguments)};String.localeFormat=function(){return String._toFormattedString(true,arguments)};String._toFormattedString=function(l,j){var c="",e=j[0];for(var a=0;true;){var f=e.indexOf("{",a),d=e.indexOf("}",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)==="{"){c+="{";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(":"),k=parseInt(g<0?h:h.substring(0,g))+1,i=g<0?"":h.substring(g+1),b=j[k];if(typeof b==="undefined"||b===null)b="";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Type.registerNamespace("Sys");Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface("Sys.IDisposable");Sys.StringBuilder=function(a){this._parts=typeof a!=="undefined"&&a!==null&&a!==""?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a==="undefined"||a===null||a===""?"\r\n":a+"\r\n"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===""},toString:function(a){a=a||"";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]==="undefined"){if(a!=="")for(var c=0;c<b.length;)if(typeof b[c]==="undefined"||b[c]===""||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass("Sys.StringBuilder");if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];for(var a=0;a<b.length;a++)try{var c=new ActiveXObject(b[a]);return c}catch(d){}return null};Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);if(navigator.userAgent.indexOf(" MSIE ")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]);Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" Firefox/")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\/(\d+\.\d+)/)[1]);Sys.Browser.name="Firefox";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" Safari/")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Safari\/(\d+\.\d+)/)[1]);Sys.Browser.name="Safari"}else if(navigator.userAgent.indexOf("Opera/")>-1)Sys.Browser.agent=Sys.Browser.Opera;Type.registerNamespace("Sys.UI");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!=="undefined"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById("TraceConsole");if(a&&a.tagName.toUpperCase()==="TEXTAREA")a.value+=b+"\n"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById("TraceConsole");if(a&&a.tagName.toUpperCase()==="TEXTAREA")a.value=""},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval("debugger")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:"traceDump";b=b?b:"";if(a===null){this.trace(b+c+": null");return}switch(typeof a){case "undefined":this.trace(b+c+": Undefined");break;case "number":case "string":case "boolean":this.trace(b+c+": "+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+": "+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+": ...");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName==="string"){var k=a.tagName?a.tagName:"DomElement";if(a.id)k+=" - "+a.id;this.trace(b+c+" {"+k+"}")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i==="string"?" {"+i+"}":""));if(b===""||f){b+="    ";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],"["+e+"]",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass("Sys._Debug");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!=="number")throw Error.argument("value",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(","),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!=="number")throw Error.argument("value",String.format(Sys.Res.enumInvalidValue,c.split(",")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c==="undefined"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(", ")}return ""}Type.prototype.registerEnum=function(c,b){for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=c;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=b;this.__enum=true};Type.isEnum=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__flags};Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);if(!a._handler)a._handler=function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)};return a._handler},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass("Sys.EventHandlerList");Sys.EventArgs=function(){};Sys.EventArgs.registerClass("Sys.EventArgs");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass("Sys.CancelEventArgs",Sys.EventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface("Sys.INotifyPropertyChange");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass("Sys.PropertyChangedEventArgs",Sys.EventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface("Sys.INotifyDisposing");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler("disposing",a)},remove_disposing:function(a){this.get_events().removeHandler("disposing",a)},add_propertyChanged:function(a){this.get_events().addHandler("propertyChanged",a)},remove_propertyChanged:function(a){this.get_events().removeHandler("propertyChanged",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler("disposing");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler("propertyChanged");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass("Sys.Component",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a["get_"+c];if(e||typeof f!=="function"){var k=a[c];if(!b||typeof b!=="object"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a["set_"+c];if(typeof l==="function")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b==="object"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c["set_"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a["add_"+e](d[e]);b._createdComponents[b._createdComponents.length]=a;if(a.get_id())b.addComponent(a);if(i)if(c)b._addComponentToSecondPass(a,c);else a.endUpdate();else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum("Sys.UI.MouseButton");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum("Sys.UI.Key");Sys.UI.DomEvent=function(c){var a=c;this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!=="undefined")this.button=typeof a.which!=="undefined"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(a.type==="keypress")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(this.target){var b=Sys.UI.DomElement.getLocation(this.target);this.offsetX=typeof a.offsetX!=="undefined"?a.offsetX:window.pageXOffset+(a.clientX||0)-b.x;this.offsetY=typeof a.offsetY!=="undefined"?a.offsetY:window.pageYOffset+(a.clientY||0)-b.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey;this.type=a.type};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)window.event.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)window.event.cancelBubble=true}};Sys.UI.DomEvent.registerClass("Sys.UI.DomEvent");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){return e.call(a,new Sys.UI.DomEvent(window.event))};a.attachEvent("on"+d,b)}c[c.length]={handler:e,browserHandler:b}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(e,d,c){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(e,b,a)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--)$removeHandler(a,b,d[c].handler)}a._events=null}},$removeHandler=Sys.UI.DomEvent.removeHandler=function(a,e,f){var d=null,c=a._events[e],d=null;for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent("on"+e,d);c.splice(b,1)};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface("Sys.IContainer");Sys._ScriptLoader=function(){this._scriptsToLoad=null;this._scriptLoadedDelegate=Function.createDelegate(this,this._scriptLoadedHandler)};Sys._ScriptLoader.prototype={dispose:function(){this._stopLoading();if(this._events)delete this._events;this._scriptLoadedDelegate=null},loadScripts:function(a,c,d,b){this._loading=true;this._allScriptsLoadedCallback=c;this._scriptLoadFailedCallback=d;this._scriptLoadTimeoutCallback=b;if(a>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a*1000);this._loadScriptsInternal()},notifyScriptLoaded:function(){if(!this._loading)return;this._currentTask._notified++;if(Sys.Browser.agent===Sys.Browser.Safari)if(this._currentTask._notified===1)window.setTimeout(Function.createDelegate(this,function(){this._scriptLoadedHandler(this._currentTask.get_scriptElement(),true)}),0)},queueCustomScriptTag:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,a)},queueScriptBlock:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{text:a})},queueScriptReference:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{src:a})},_createScriptElement:function(c){var a=document.createElement("SCRIPT");a.type="text/javascript";for(var b in c)a[b]=c[b];return a},_loadScriptsInternal:function(){if(this._scriptsToLoad&&this._scriptsToLoad.length>0){var b=Array.dequeue(this._scriptsToLoad),a=this._createScriptElement(b);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof b.src==="string"){this._currentTask=new Sys._ScriptLoaderTask(a,this._scriptLoadedDelegate);this._currentTask.execute()}else{document.getElementsByTagName("HEAD")[0].appendChild(a);Sys._ScriptLoader._clearScript(a);this._loadScriptsInternal()}}else{var c=this._allScriptsLoadedCallback;this._stopLoading();if(c)c(this)}},_raiseError:function(a){var c=this._scriptLoadFailedCallback,b=this._currentTask.get_scriptElement();this._stopLoading();if(c)c(this,b,a);else throw Sys._ScriptLoader._errorScriptLoadFailed(b.src,a)},_scriptLoadedHandler:function(a,b){if(b&&this._currentTask._notified)if(this._currentTask._notified>1)this._raiseError(true);else{Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError(false)},_scriptLoadTimeoutHandler:function(){var a=this._scriptLoadTimeoutCallback;this._stopLoading();if(a)a(this)},_stopLoading:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}this._scriptsToLoad=null;this._loading=null;this._allScriptsLoadedCallback=null;this._scriptLoadFailedCallback=null;this._scriptLoadTimeoutCallback=null}};Sys._ScriptLoader.registerClass("Sys._ScriptLoader",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement("script");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var b=Sys._ScriptLoader._referencedScripts=[],c=document.getElementsByTagName("SCRIPT");for(i=c.length-1;i>=0;i--){var d=c[i],a=d.src;if(a.length)if(!Array.contains(b,a))Array.add(b,a)}}};Sys._ScriptLoader._clearScript=function(a){if(!Sys.Debug.isDebug)a.parentNode.removeChild(a)};Sys._ScriptLoader._errorScriptLoadFailed=function(b,d){var a;if(d)a=Sys.Res.scriptLoadMultipleCallbacks;else a=Sys.Res.scriptLoadFailed;var e="Sys.ScriptLoadFailedException: "+String.format(a,b),c=Error.create(e,{name:"Sys.ScriptLoadFailedException","scriptUrl":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a;this._notified=0};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoader._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){this._addScriptElementHandlers();document.getElementsByTagName("HEAD")[0].appendChild(this._scriptElement)},_addScriptElementHandlers:function(){this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(Sys.Browser.agent!==Sys.Browser.InternetExplorer){this._scriptElement.readyState="loaded";$addHandler(this._scriptElement,"load",this._scriptLoadDelegate)}else $addHandler(this._scriptElement,"readystatechange",this._scriptLoadDelegate);this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);$addHandler(this._scriptElement,"error",this._scriptErrorDelegate)},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(Sys.Browser.agent!==Sys.Browser.InternetExplorer)$removeHandler(a,"load",this._scriptLoadDelegate);else $removeHandler(a,"readystatechange",this._scriptLoadDelegate);$removeHandler(a,"error",this._scriptErrorDelegate);this._scriptErrorDelegate=null;this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(a.readyState!=="loaded"&&a.readyState!=="complete")return;var b=this;window.setTimeout(function(){b._completedCallback(a,true)},0)}};Sys._ScriptLoaderTask.registerClass("Sys._ScriptLoaderTask",null,Sys.IDisposable);Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass("Sys.ApplicationLoadEventArgs",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);this._loadHandlerDelegate=Function.createDelegate(this,this._loadHandler);Sys.UI.DomEvent.addHandler(window,"unload",this._unloadHandlerDelegate);Sys.UI.DomEvent.addHandler(window,"load",this._loadHandlerDelegate)};Sys._Application.prototype={_creatingComponents:false,_disposing:false,get_isCreatingComponents:function(){return this._creatingComponents},add_load:function(a){this.get_events().addHandler("load",a)},remove_load:function(a){this.get_events().removeHandler("load",a)},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler("init",a)},remove_init:function(a){this.get_events().removeHandler("init",a)},add_unload:function(a){this.get_events().addHandler("unload",a)},remove_unload:function(a){this.get_events().removeHandler("unload",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler("unload");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,e=b.length;a<e;a++)b[a].dispose();Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,"unload",this._unloadHandlerDelegate);if(this._loadHandlerDelegate){Sys.UI.DomEvent.removeHandler(window,"load",this._loadHandlerDelegate);this._loadHandlerDelegate=null}var d=Sys._ScriptLoader.getInstance();if(d)d.dispose();Sys._Application.callBaseMethod(this,"dispose")}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this._initialized&&!this._initializing){this._initializing=true;window.setTimeout(Function.createDelegate(this,this._doInitialize),0)}},notifyScriptLoaded:function(){var a=Sys._ScriptLoader.getInstance();if(a)a.notifyScriptLoaded()},registerDisposableObject:function(a){if(!this._disposing)this._disposableObjects[this._disposableObjects.length]=a},raiseLoad:function(){var b=this.get_events().getHandler("load"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!this._initializing);if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing)Array.remove(this._disposableObjects,a)},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_doInitialize:function(){Sys._Application.callBaseMethod(this,"initialize");var a=this.get_events().getHandler("init");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}this.raiseLoad();this._initializing=false},_loadHandler:function(){if(this._loadHandlerDelegate){Sys.UI.DomEvent.removeHandler(window,"load",this._loadHandlerDelegate);this._loadHandlerDelegate=null}this.initialize()},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass("Sys._Application",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Type.registerNamespace("Sys.Net");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass("Sys.Net.WebRequestExecutor");window.XMLDOM=function(d){if(!window.DOMParser){var c=["Msxml2.DOMDocument.3.0","Msxml2.DOMDocument"];for(var b=0;b<c.length;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty("SelectionLanguage","XPath");return a}catch(f){}return null}else try{var e=new window.DOMParser;return e.parseFromString(d,"text/xml")}catch(f){return null}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){a._clearTimer();a._responseAvailable=true;a._webRequest.completed(Sys.EventArgs.Empty);if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);if(a)for(var b in a){var f=a[b];if(typeof f!=="function")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()==="post"){if(a===null||!a["Content-Type"])this._xmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");if(!c)c=""}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a="";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){return this._xmlHttpRequest.status},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=new XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf("MSIE")!==-1)a.setProperty("SelectionLanguage","XPath");if(a.documentElement.namespaceURI==="http://www.mozilla.org/newlayout/xml/parsererror.xml"&&a.documentElement.tagName==="parsererror")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName==="parsererror")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;var a=this._webRequest._get_eventHandlerList().getHandler("completed");if(a)a(this,Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass("Sys.Net.XMLHttpExecutor",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._this=this;this._defaultTimeout=0;this._defaultExecutorType="Sys.Net.XMLHttpExecutor"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler("invokingRequest",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler("invokingRequest",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler("completedRequest",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler("completedRequest",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler("invokingRequest");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass("Sys.Net._WebRequestManager");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass("Sys.Net.NetworkRequestEventArgs",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url="";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler("completed",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler("completed",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler("completedRequest");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler("completed");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return "GET";return "POST"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf("://")!==-1)return b;if(!a||a.length===0){var c=document.getElementsByTagName("base")[0];if(c&&c.href&&c.href.length>0)a=c.href;else a=document.URL}var d=a.indexOf("?");if(d!==-1)a=a.substr(0,d);a=a.substr(0,a.lastIndexOf("/")+1);if(!b||b.length===0)return a;if(b.charAt(0)==="/"){var e=a.indexOf("://"),g=a.indexOf("/",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf("/");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(d,b){if(!b)b=encodeURIComponent;var a=new Sys.StringBuilder,f=0;for(var c in d){var e=d[c];if(typeof e==="function")continue;var g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(f!==0)a.append("&");a.append(c);a.append("=");a.append(b(g));f++}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b){if(!b)return a;var d=Sys.Net.WebRequest._createQueryString(b);if(d.length>0){var c="?";if(a&&a.indexOf("?")!==-1)c="&";return a+c+d}else return a};Sys.Net.WebRequest.registerClass("Sys.Net.WebRequest");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={set_timeout:function(a){this._timeout=a},get_timeout:function(){return this._timeout},set_defaultUserContext:function(a){this._userContext=a},get_defaultUserContext:function(){return this._userContext},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultSucceededCallback:function(){return this._succeeded},set_defaultFailedCallback:function(a){this._failed=a},get_defaultFailedCallback:function(){return this._failed},set_path:function(a){this._path=a},get_path:function(){return this._path},_invoke:function(d,e,g,f,c,b,a){if(c===null||typeof c==="undefined")c=this.get_defaultSucceededCallback();if(b===null||typeof b==="undefined")b=this.get_defaultFailedCallback();if(a===null||typeof a==="undefined")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout())}};Sys.Net.WebServiceProxy.registerClass("Sys.Net.WebServiceProxy");Sys.Net.WebServiceProxy.invoke=function(k,a,j,d,i,c,f,h){var b=new Sys.Net.WebRequest;b.get_headers()["Content-Type"]="application/json; charset=utf-8";if(!d)d={};var g=d;if(!j||!g)g={};b.set_url(Sys.Net.WebRequest._createUrl(k+"/"+a,g));var e=null;if(!j){e=Sys.Serialization.JavaScriptSerializer.serialize(d);if(e==="{}")e=""}b.set_body(e);b.add_completed(l);if(h&&h>0)b.set_timeout(h);b.invoke();function l(d){if(d.get_responseAvailable()){var e=d.get_statusCode(),b=null;try{var j=d.getResponseHeader("Content-Type");if(j.startsWith("application/json"))b=d.get_object();else if(j.startsWith("text/xml"))b=d.get_xml();else b=d.get_responseData()}catch(m){}var k=d.getResponseHeader("jsonerror"),g=k==="true";if(g)b=new Sys.Net.WebServiceError(false,b.Message,b.StackTrace,b.ExceptionType);if(e<200||e>=300||g){if(c){if(!b||!g)b=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a),"","");b._statusCode=e;c(b,f,a)}}else if(i)i(b,f,a)}else{var h;if(d.get_timedOut())h=String.format(Sys.Res.webServiceTimedOut,a);else h=String.format(Sys.Res.webServiceFailedNoMsg,a);if(c)c(new Sys.Net.WebServiceError(d.get_timedOut(),h,"",""),f,a)}}return b};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys.Net.WebServiceError=function(c,d,b,a){this._timedOut=c;this._message=d;this._stackTrace=b;this._exceptionType=a;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace},get_exceptionType:function(){return this._exceptionType}};Sys.Net.WebServiceError.registerClass("Sys.Net.WebServiceError");Type.registerNamespace("Sys.Services");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath="";Sys.Services._ProfileService.prototype={_defaultFailedCallback:null,_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:"",_timeout:0,get_defaultFailedCallback:function(){return this._defaultFailedCallback},set_defaultFailedCallback:function(a){this._defaultFailedCallback=a},get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path},set_path:function(a){if(!a||!a.length)a="";this._path=a},get_timeout:function(){return this._timeout},set_timeout:function(a){this._timeout=a},load:function(b,d,e,f){var c={},a;if(!b)a="GetAllPropertiesForCurrentUser";else{a="GetPropertiesForCurrentUser";c={properties:this._clonePropertyNames(b)}}this._invoke(this._get_path(),a,false,c,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,a,c,e){var b=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),"SetPropertiesForCurrentUser",false,{values:b},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[a,c,e])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b<e.length;b++){var a=e[b];if(!d[a]){Array.add(c,a);d[a]=true}}return c},_flattenProperties:function(a,h,i){var b={},e,d;if(a&&a.length===0)return b;for(var c in h){e=h[c];d=i?i+"."+c:c;if(Sys.Services.ProfileGroup.isInstanceOfType(e)){var g=this._flattenProperties(a,e,d);for(var f in g){var j=g[f];b[f]=j}}else if(!a||Array.indexOf(a,d)!==-1)b[d]=e}return b},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._ProfileService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoadComplete:function(a,f,g){if(typeof a!=="object")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,g,"Object"));var d=this._unflattenProperties(a);for(var b in d)this.properties[b]=d[b];var c=f[0],e=c?c:this._defaultLoadCompletedCallback;if(e)e(a.length,f[2],"Sys.Services.ProfileService.load")},_onLoadFailed:function(d,c){var a=c[1],b=a?a:this._defaultFailedCallback;if(b)b(d,c[2],"Sys.Services.ProfileService.load")},_onSaveComplete:function(d,c,f){if(typeof d!=="number")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,"Number"));var a=c[0],e=c[2],b=a?a:this._defaultSaveCompletedCallback;if(b)b(d,e,"Sys.Services.ProfileService.save")},_onSaveFailed:function(e,c){var a=c[1],d=c[2],b=a?a:this._defaultFailedCallback;if(b)b(e,d,"Sys.Services.ProfileService.save")},_unflattenProperties:function(e){var c={},d,f,h=0;for(var a in e){h++;f=e[a];d=a.indexOf(".");if(d!==-1){var g=a.substr(0,d);a=a.substr(d+1);var b=c[g];if(!b||!Sys.Services.ProfileGroup.isInstanceOfType(b)){b=new Sys.Services.ProfileGroup;c[g]=b}b[a]=f}else c[a]=f}e.length=h;return c}};Sys.Services._ProfileService.registerClass("Sys.Services._ProfileService",Sys.Net.WebServiceProxy);Sys.Services.ProfileService=new Sys.Services._ProfileService;Sys.Services.ProfileGroup=function(a){if(a)for(var b in a)this[b]=a[b]};Sys.Services.ProfileGroup.registerClass("Sys.Services.ProfileGroup");Sys.Services._AuthenticationService=function(){Sys.Services._AuthenticationService.initializeBase(this)};Sys.Services._AuthenticationService.DefaultWebServicePath="";Sys.Services._AuthenticationService.prototype={_defaultFailedCallback:null,_defaultLoginCompletedCallback:null,_defaultLogoutCompletedCallback:null,_path:"",_timeout:0,_authenticated:false,get_defaultFailedCallback:function(){return this._defaultFailedCallback},set_defaultFailedCallback:function(a){this._defaultFailedCallback=a},get_defaultLoginCompletedCallback:function(){return this._defaultLoginCompletedCallback},set_defaultLoginCompletedCallback:function(a){this._defaultLoginCompletedCallback=a},get_defaultLogoutCompletedCallback:function(){return this._defaultLogoutCompletedCallback},set_defaultLogoutCompletedCallback:function(a){this._defaultLogoutCompletedCallback=a},get_isLoggedIn:function(){return this._authenticated},get_path:function(){return this._path},set_path:function(a){if(!a||!a.length)a="";this._path=a},get_timeout:function(){return this._timeout},set_timeout:function(a){this._timeout=a},login:function(c,b,a,h,f,d,e,g){this._invoke(this._get_path(),"Login",false,{userName:c,password:b,createPersistentCookie:a},Function.createDelegate(this,this._onLoginComplete),Function.createDelegate(this,this._onLoginFailed),[c,b,a,f,d,e,g])},logout:function(c,a,b,d){this._invoke(this._get_path(),"Logout",false,{},Function.createDelegate(this,this._onLogoutComplete),Function.createDelegate(this,this._onLogoutFailed),[c,a,b,d])},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._AuthenticationService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoginComplete:function(f,c,g){if(typeof f!=="boolean")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,g,"Boolean"));var b=c[3],d=c[4],e=c[6],a=d?d:this._defaultLoginCompletedCallback;if(f){this._authenticated=true;if(a)a(true,e,"Sys.Services.AuthenticationService.login");if(typeof b!=="undefined"&&b!==null)window.location.href=b}else if(a)a(false,e,"Sys.Services.AuthenticationService.login")},_onLoginFailed:function(d,c){var a=c[5],b=a?a:this._defaultFailedCallback;if(b)b(d,c[6],"Sys.Services.AuthenticationService.login")},_onLogoutComplete:function(g,a,f){if(g!==null)throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,"null"));var c=a[0],b=a[1],e=a[3],d=b?b:this._defaultLogoutCompletedCallback;this._authenticated=false;if(d)d(null,e,"Sys.Services.AuthenticationService.logout");if(!c)window.location.reload();else window.location.href=c},_onLogoutFailed:function(d,c){var a=c[2],b=a?a:this._defaultFailedCallback;if(b)b(d,c[3],"Sys.Services.AuthenticationService.logout")},_setAuthenticated:function(a){this._authenticated=a}};Sys.Services._AuthenticationService.registerClass("Sys.Services._AuthenticationService",Sys.Net.WebServiceProxy);Sys.Services.AuthenticationService=new Sys.Services._AuthenticationService;Type.registerNamespace("Sys.Serialization");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass("Sys.Serialization.JavaScriptSerializer");Sys.Serialization.JavaScriptSerializer._stringRegEx=new RegExp('["\b\f\n\r\t\\\\\x00-\x1F]',"i");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,h){var c;switch(typeof b){case "object":if(b)if(Array.isInstanceOfType(b)){a.append("[");for(c=0;c<b.length;++c){if(c>0)a.append(",");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a)}a.append("]")}else{if(Date.isInstanceOfType(b)){a.append('"\\/Date(');a.append(b.getTime());a.append(')\\/"');break}var e=[],i=0;for(var g in b){if(g.startsWith("$"))continue;e[i++]=g}if(h)e.sort();a.append("{");var j=false;for(c=0;c<i;c++){var f=b[e[c]];if(typeof f!=="undefined"&&typeof f!=="function"){if(j)a.append(",");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(e[c],a,h);a.append(":");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(f,a,h)}}a.append("}")}else a.append("null");break;case "number":if(isFinite(b))a.append(String(b));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers);break;case "string":a.append('"');if(Sys.Browser.agent===Sys.Browser.Safari||Sys.Serialization.JavaScriptSerializer._stringRegEx.test(b)){var k=b.length;for(c=0;c<k;++c){var d=b.charAt(c);if(d>=" "){if(d==="\\"||d==='"')a.append("\\");a.append(d)}else switch(d){case "\b":a.append("\\b");break;case "\f":a.append("\\f");break;case "\n":a.append("\\n");break;case "\r":a.append("\\r");break;case "\t":a.append("\\t");break;default:a.append("\\u00");if(d.charCodeAt()<16)a.append("0");a.append(d.charCodeAt().toString(16))}}}else a.append(b);a.append('"');break;case "boolean":a.append(b.toString());break;default:a.append("null");break}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data){if(data.length===0)throw Error.argument("data",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)\\)\\\\/\\"',"g"),"$1new Date($2)");return eval("("+exp+")")}catch(a){throw Error.argument("data",Sys.Res.cannotDeserializeInvalidJson)}};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getMonthIndex:function(a){if(!this._upperMonths)this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);return Array.indexOf(this._upperMonths,this._toUpper(a))},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths)this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);return Array.indexOf(this._upperMonths,this._toUpper(a))},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split("\u00A0").join(" ").toUpperCase()}};Sys.CultureInfo._parse=function(b){var a=Sys.Serialization.JavaScriptSerializer.deserialize(b);return new Sys.CultureInfo(a.name,a.numberFormat,a.dateTimeFormat)};Sys.CultureInfo.registerClass("Sys.CultureInfo");Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse('{"name":"","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":".","IsReadOnly":true,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":",","CurrencySymbol":"\u00A4","NaNSymbol":"NaN","CurrencyNegativePattern":0,"NumberNegativePattern":1,"PercentPositivePattern":0,"PercentNegativePattern":0,"NegativeInfinitySymbol":"-Infinity","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":".","NumberGroupSeparator":",","CurrencyPositivePattern":0,"PositiveInfinitySymbol":"Infinity","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":".","PercentGroupSeparator":",","PercentSymbol":"%","PerMilleSymbol":"\u2030","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"AM","Calendar":{"MinSupportedDateTime":"@-62135568000000@","MaxSupportedDateTime":"@253402300799999@","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":true},"DateSeparator":"/","FirstDayOfWeek":0,"CalendarWeekRule":0,"FullDateTimePattern":"dddd, dd MMMM yyyy HH:mm:ss","LongDatePattern":"dddd, dd MMMM yyyy","LongTimePattern":"HH:mm:ss","MonthDayPattern":"MMMM dd","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\':\'mm\':\'ss \'GMT\'","ShortDatePattern":"MM/dd/yyyy","ShortTimePattern":"HH:mm","SortableDateTimePattern":"yyyy\'-\'MM\'-\'dd\'T\'HH\':\'mm\':\'ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\'-\'MM\'-\'dd HH\':\'mm\':\'ss\'Z\'","YearMonthPattern":"yyyy MMMM","AbbreviatedDayNames":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"ShortestDayNames":["Su","Mo","Tu","We","Th","Fr","Sa"],"DayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"AbbreviatedMonthNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthNames":["January","February","March","April","May","June","July","August","September","October","November","December",""],"IsReadOnly":true,"NativeCalendarName":"Gregorian Calendar","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthGenitiveNames":["January","February","March","April","May","June","July","August","September","October","November","December",""]}}');if(typeof __cultureInfo==="undefined")var __cultureInfo='{"name":"en-US","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":".","IsReadOnly":false,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":",","CurrencySymbol":"$","NaNSymbol":"NaN","CurrencyNegativePattern":0,"NumberNegativePattern":1,"PercentPositivePattern":0,"PercentNegativePattern":0,"NegativeInfinitySymbol":"-Infinity","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":".","NumberGroupSeparator":",","CurrencyPositivePattern":0,"PositiveInfinitySymbol":"Infinity","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":".","PercentGroupSeparator":",","PercentSymbol":"%","PerMilleSymbol":"\u2030","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"AM","Calendar":{"MinSupportedDateTime":"@-62135568000000@","MaxSupportedDateTime":"@253402300799999@","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":false},"DateSeparator":"/","FirstDayOfWeek":0,"CalendarWeekRule":0,"FullDateTimePattern":"dddd, MMMM dd, yyyy h:mm:ss tt","LongDatePattern":"dddd, MMMM dd, yyyy","LongTimePattern":"h:mm:ss tt","MonthDayPattern":"MMMM dd","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\':\'mm\':\'ss \'GMT\'","ShortDatePattern":"M/d/yyyy","ShortTimePattern":"h:mm tt","SortableDateTimePattern":"yyyy\'-\'MM\'-\'dd\'T\'HH\':\'mm\':\'ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\'-\'MM\'-\'dd HH\':\'mm\':\'ss\'Z\'","YearMonthPattern":"MMMM, yyyy","AbbreviatedDayNames":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"ShortestDayNames":["Su","Mo","Tu","We","Th","Fr","Sa"],"DayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"AbbreviatedMonthNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthNames":["January","February","March","April","May","June","July","August","September","October","November","December",""],"IsReadOnly":false,"NativeCalendarName":"Gregorian Calendar","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthGenitiveNames":["January","February","March","April","May","June","July","August","September","October","November","December",""]}}';Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo;Sys.UI.Point=function(a,b){this.x=a;this.y=b};Sys.UI.Point.registerClass("Sys.UI.Point");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass("Sys.UI.Bounds");Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass("Sys.UI.DomElement");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className==="")a.className=b;else a.className+=" "+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(" "),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};switch(Sys.Browser.agent){case Sys.Browser.InternetExplorer:Sys.UI.DomElement.getLocation=function Sys$UI$DomElement$getLocation(a){if(a.self||a.nodeType===9)return new Sys.UI.Point(0,0);var d=a.getClientRects();if(!d||!d.length)return new Sys.UI.Point(0,0);var e=a.ownerDocument.parentWindow,g=e.screenLeft-top.screenLeft-top.document.documentElement.scrollLeft+2,h=e.screenTop-top.screenTop-top.document.documentElement.scrollTop+2,c=e.frameElement||null;if(c){var b=c.currentStyle;g+=(c.frameBorder||1)*2+(parseInt(b.paddingLeft)||0)+(parseInt(b.borderLeftWidth)||0)-a.ownerDocument.documentElement.scrollLeft;h+=(c.frameBorder||1)*2+(parseInt(b.paddingTop)||0)+(parseInt(b.borderTopWidth)||0)-a.ownerDocument.documentElement.scrollTop}var f=d[0];return new Sys.UI.Point(f.left-g,f.top-h)};break;case Sys.Browser.Safari:Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var g=0,h=0,j=null,f=null,b;for(var a=c;a;j=a,(f=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var e=a.tagName;if((a.offsetLeft||a.offsetTop)&&(e!=="BODY"||(!f||f.position!=="absolute"))){g+=a.offsetLeft;h+=a.offsetTop}}b=Sys.UI.DomElement._getCurrentStyle(c);var d=b?b.position:null,k=d&&d!=="static";if(!d||d!=="absolute")for(var a=c.parentNode;a;a=a.parentNode){e=a.tagName;if(e!=="BODY"&&e!=="HTML"&&(a.scrollLeft||a.scrollTop)){g-=a.scrollLeft||0;h-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i==="absolute")break}return new Sys.UI.Point(g,h)};break;case Sys.Browser.Opera:Sys.UI.DomElement.getLocation=function(b){if(b.window&&b.window===b||b.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,i=null;for(var a=b;a;i=a,a=a.offsetParent){var f=a.tagName;d+=a.offsetLeft||0;e+=a.offsetTop||0}var g=b.style.position,c=g&&g!=="static";for(var a=b.parentNode;a;a=a.parentNode){f=a.tagName;if(f!=="BODY"&&f!=="HTML"&&(a.scrollLeft||a.scrollTop)&&(c&&(a.style.overflow==="scroll"||a.style.overflow==="auto"))){d-=a.scrollLeft||0;e-=a.scrollTop||0}var h=a&&a.style?a.style.position:null;c=c||h&&h!=="static"}return new Sys.UI.Point(d,e)};break;default:Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,i=null,h=null,b=null;for(var a=d;a;i=a,(h=b,a=a.offsetParent)){var c=a.tagName;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c==="BODY"&&(!h||h.position!=="absolute"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!=="TABLE"&&c!=="TD"&&c!=="HTML"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c==="TABLE"&&(b.position==="relative"||b.position==="absolute")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var g=b?b.position:null,j=g&&g!=="static";if(!g||g!=="absolute")for(var a=d.parentNode;a;a=a.parentNode){c=a.tagName;if(c!=="BODY"&&c!=="HTML"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}return new Sys.UI.Point(e,f)};break}Sys.UI.DomElement.removeCssClass=function(d,c){var a=" "+d.className+" ",b=a.indexOf(" "+c+" ");if(b>=0)d.className=(a.substr(0,b)+" "+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position="absolute";a.left=c+"px";a.top=d+"px"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement._getCurrentStyle=function(a){var b=(a.ownerDocument?a.ownerDocument:a.documentElement).defaultView;return b&&a!==b&&b.getComputedStyle?b.getComputedStyle(a,null):a.style};Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,"get_id");if(a)return a;if(!this._element||!this._element.id)return "";return this._element.id+"$"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(".");if(b!=-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,"initialize");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,"dispose");if(this._element){var a=this.get_name();if(a)this._element[a]=null;Array.remove(this._element._behaviors,this);delete this._element}}};Sys.UI.Behavior.registerClass("Sys.UI.Behavior",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum("Sys.UI.VisibilityMode");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;this._oldDisplayMode=this._element.style.display;if(!this._oldDisplayMode||this._oldDisplayMode=="none")this._oldDisplayMode=""};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return "";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;else{var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null}},set_parent:function(a){this._parent=a},get_visibilityMode:function(){return this._visibilityMode},set_visibilityMode:function(a){if(this._visibilityMode!==a){this._visibilityMode=a;if(this.get_visible()===false)if(this._visibilityMode===Sys.UI.VisibilityMode.hide)this._element.style.display=this._oldDisplayMode;else this._element.style.display="none"}this._visibilityMode=a},get_visible:function(){return this._element.style.visibility!="hidden"},set_visible:function(a){if(a!=this.get_visible()){this._element.style.visibility=a?"visible":"hidden";if(a||this._visibilityMode===Sys.UI.VisibilityMode.hide)this._element.style.display=this._oldDisplayMode;else this._element.style.display="none"}},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,"dispose");if(this._element){this._element.control=undefined;delete this._element}},initialize:function(){Sys.UI.Control.callBaseMethod(this,"initialize");var a=this._element},onBubbleEvent:function(){return false},raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass("Sys.UI.Control",Sys.Component)
Sys.Res={'argumentInteger':'Value must be an integer.','scriptLoadMultipleCallbacks':'The script \'{0}\' contains multiple calls to Sys.Application.notifyScriptLoaded(). Only one is allowed.','invokeCalledTwice':'Cannot call invoke more than once.','webServiceFailed':'The server method \'{0}\' failed with the following error: {1}','argumentType':'Object cannot be converted to the required type.','argumentNull':'Value cannot be null.','controlCantSetId':'The id property can\'t be set on a control.','formatBadFormatSpecifier':'Format specifier was invalid.','webServiceFailedNoMsg':'The server method \'{0}\' failed.','argumentDomElement':'Value must be a DOM element.','invalidExecutorType':'Could not create a valid Sys.Net.WebRequestExecutor from: {0}.','cannotCallBeforeResponse':'Cannot call {0} when responseAvailable is false.','actualValue':'Actual value was {0}.','enumInvalidValue':'\'{0}\' is not a valid value for enum {1}.','scriptLoadFailed':'The script \'{0}\' could not be loaded.','parameterCount':'Parameter count mismatch.','cannotDeserializeEmptyString':'Cannot deserialize empty string.','formatInvalidString':'Input string was not in a correct format.','invalidTimeout':'Value must be greater than or equal to zero.','cannotAbortBeforeStart':'Cannot abort when executor has not started.','argument':'Value does not fall within the expected range.','cannotDeserializeInvalidJson':'Cannot deserialize. The data does not correspond to valid JSON.','invalidHttpVerb':'httpVerb cannot be set to an empty or null string.','nullWebRequest':'Cannot call executeRequest with a null webRequest.','eventHandlerInvalid':'Handler was not added through the Sys.UI.DomEvent.addHandler method.','cannotSerializeNonFiniteNumbers':'Cannot serialize non finite numbers.','argumentUndefined':'Value cannot be undefined.','webServiceInvalidReturnType':'The server method \'{0}\' returned an invalid type. Expected type: {1}','servicePathNotSet':'The path to the web service has not been set.','argumentTypeWithTypes':'Object of type \'{0}\' cannot be converted to type \'{1}\'.','cannotCallOnceStarted':'Cannot call {0} once started.','badBaseUrl1':'Base URL does not contain ://.','badBaseUrl2':'Base URL does not contain another /.','badBaseUrl3':'Cannot find last / in base URL.','setExecutorAfterActive':'Cannot set executor after it has become active.','paramName':'Parameter name: {0}','cannotCallOutsideHandler':'Cannot call {0} outside of a completed event handler.','format':'One of the identified items was in an invalid format.','assertFailedCaller':'Assertion Failed: {0}\r\nat {1}','argumentOutOfRange':'Specified argument was out of the range of valid values.','webServiceTimedOut':'The server method \'{0}\' timed out.','notImplemented':'The method or operation is not implemented.','assertFailed':'Assertion Failed: {0}','invalidOperation':'Operation is not valid due to the current state of the object.','breakIntoDebugger':'{0}\r\n\r\nBreak into debugger?'};
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();

// baseplayer

Type.registerNamespace('Ee.UI.Xaml');

Ee.UI.Xaml.scriptVersion = "1.0.070606.0";

Ee.UI.Xaml.ScaleMode = function Ee$UI$Xaml$ScaleMode() {
    /// <field name="none" type="Number" integer="true" static="true"></field>
    /// <field name="zoom" type="Number" integer="true" static="true"></field>
    /// <field name="stretch" type="Number" integer="true" static="true"></field>
    if (arguments.length !== 0) throw Error.parameterCount();
    throw Error.notImplemented();
}




Ee.UI.Xaml.ScaleMode.prototype = {
    none: 0,
    zoom: 1,
    stretch: 2
}
Ee.UI.Xaml.ScaleMode.registerEnum('Ee.UI.Xaml.ScaleMode');
Ee.UI.Xaml.Control = function Ee$UI$Xaml$Control(domElement) {
    /// <param name="domElement" domElement="true"></param>
    var e = Function._validateParams(arguments, [
        {name: "domElement", domElement: true}
    ]);
    if (e) throw e;

    Ee.UI.Xaml.Control.initializeBase(this, [domElement]);
}

function Ee$UI$Xaml$Control$add_xamlError(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler('xamlError', handler);
    }
    function Ee$UI$Xaml$Control$remove_xamlError(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler('xamlError', handler);
    }

    function Ee$UI$Xaml$Control$add_resize(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler("resize", handler);
    }
    function Ee$UI$Xaml$Control$remove_resize(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("resize", handler);
    }

    function Ee$UI$Xaml$Control$add_xamlInitialized(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler('xamlInitialized', handler);
    }
    function Ee$UI$Xaml$Control$remove_xamlInitialized(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler('xamlInitialized', handler);
    }

    function Ee$UI$Xaml$Control$get_scaleMode() {
        /// <value type="Ee.UI.Xaml.ScaleMode"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._scaleMode;
    }
    function Ee$UI$Xaml$Control$set_scaleMode(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Ee.UI.Xaml.ScaleMode}]);
        if (e) throw e;

        this._scaleMode = value;
        if (this._xamlInitialized && value !== Ee.UI.Xaml.ScaleMode.none) {
            this._ensureTransform();
        }
    }


    function Ee$UI$Xaml$Control$get_xamlSource() {
        /// <value type="String"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._xamlSource || "";
    }
    function Ee$UI$Xaml$Control$set_xamlSource(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: String}]);
        if (e) throw e;

        if (this.get_isInitialized()) {
            throw Error.invalidOperation(Ee.UI.Xaml.Res.cannotChangeXamlSource);
        }
        this._xamlSource = value;
    }

    function Ee$UI$Xaml$Control$addEventListener(element, eventName, handler) {
        /// <param name="element"></param>
        /// <param name="eventName" type="String"></param>
        /// <param name="handler" type="Function"></param>
        /// <returns></returns>
        var e = Function._validateParams(arguments, [
            {name: "element"},
            {name: "eventName", type: String},
            {name: "handler", type: Function}
        ]);
        if (e) throw e;

        if (!this._boundEvents) {
            this._boundEvents = [];
        }

        var token = element.addEventListener(eventName, handler);
        this._boundEvents[this._boundEvents.length] = { element: element, eventName: eventName, token: token };
        return token;
    }

    function Ee$UI$Xaml$Control$addEventListeners(element, events, handlerOwner) {
        /// <param name="element"></param>
        /// <param name="events" type="Object"></param>
        /// <param name="handlerOwner" optional="true"></param>
        /// <returns></returns>
        var e = Function._validateParams(arguments, [
            {name: "element"},
            {name: "events", type: Object},
            {name: "handlerOwner", optional: true}
        ]);
        if (e) throw e;

        var tokens = { };
        for (var name in events) {
            var handler = events[name];
            if (typeof(handler) !== 'function') throw Error.invalidOperation(Sys.Res.cantAddNonFunctionhandler);
            if (handlerOwner) {
                handler = Function.createDelegate(handlerOwner, handler);
            }
            tokens[name] = this.addEventListener(element, name, handler);
        }
        return tokens;
    }

    function Ee$UI$Xaml$Control$dispose() {
        var host = this.get_element();
        if (host) {
            if (this._resizeDelegate) {
                host.content.onResize = null;
                this._resizeDelegate = null;
            }
            host.OnLoad = null;
            host.OnError = null;
        }

        if (this._xamlInitialized) {
            this.xamlDispose();
            this._xamlInitialized = false;
        }
        
        if (this._boundEvents) {
            for (var i = 0, l = this._boundEvents.length; i < l; i++) {
                var e = this._boundEvents[i];
                e.element.removeEventListener(e.eventName, e.token);
            }
            this._boundEvents = null;
        }

        Ee.UI.Xaml.Control.callBaseMethod(this, "dispose");
    }

    function Ee$UI$Xaml$Control$initialize() {
        Ee.UI.Xaml.Control.callBaseMethod(this, "initialize");

        var host = this.get_element();
        host.OnError = Function.createDelegate(this, this._xamlError);
        
        // set the xaml source
        var src = this.get_xamlSource();
        if (src && (typeof(host.Source) === 'undefined' || host.Source !== src)) {
            host.OnLoad = Function.createDelegate(this, this._xamlLoaded);
            host.Source = src;
        }
        else {
            // if we are not setting the source we assume its already been loaded by some other means
            this._raiseXamlInitialize();
        }
    }

    function Ee$UI$Xaml$Control$onResize(args) {
        /// <param name="args" type="Sys.EventArgs"></param>
        var e = Function._validateParams(arguments, [
            {name: "args", type: Sys.EventArgs}
        ]);
        if (e) throw e;

    }

    function Ee$UI$Xaml$Control$onXamlError(errorEventArgs) {
        /// <param name="errorEventArgs" type="Ee.UI.Xaml.ErrorEventArgs"></param>
        var e = Function._validateParams(arguments, [
            {name: "errorEventArgs", type: Ee.UI.Xaml.ErrorEventArgs}
        ]);
        if (e) throw e;

    }

    function Ee$UI$Xaml$Control$xamlDispose() {
        if (arguments.length !== 0) throw Error.parameterCount();
    }

    function Ee$UI$Xaml$Control$xamlInitialize() {
        if (arguments.length !== 0) throw Error.parameterCount();
    }

    function Ee$UI$Xaml$Control$_ensureTransform() {

        var root = this.get_element().content.root;
        var scalePlayer = Ee.UI.Xaml.Control._computeScale(root);
        var x, y;
        if (this.get_scaleMode() === Ee.UI.Xaml.ScaleMode.zoom) {
            // zoom
            x = y = Math.min(scalePlayer.horizontal, scalePlayer.vertical);
        }
        else {
            // fit
            x = scalePlayer.horizontal;
            y = scalePlayer.vertical;
        }
        Ee.UI.Xaml.Control._ensureScale(root, x, y);
        
        // ensure we are watching the resize event
        if (!this._resizeDelegate) {
            this._resizeDelegate = Function.createDelegate(this, this._onResize);
            root.getHost().content.onResize = this._resizeDelegate;
        }
    }

    function Ee$UI$Xaml$Control$_onResize() {
        var element = this.get_element();
        // DevDiv Bugs 125915: may have been disposed by now. SL calls us even though we unhook.
        if (element && (this.get_scaleMode() !== Ee.UI.Xaml.ScaleMode.none)) {
            this._ensureTransform();

            var args = Sys.EventArgs.Empty;
            this.onResize(args);
            var handler = this.get_events().getHandler("resize");
            if (handler) {
                handler(this, args);
            }
        }
    }

    function Ee$UI$Xaml$Control$_raiseXamlError(sender, errorEventArgs) {
        this.onXamlError(errorEventArgs);
        
        if (!errorEventArgs.get_cancel()) {
            var handler = this.get_events().getHandler("xamlError");
            if (handler) {
                handler(this, errorEventArgs);
            }
            // in debug mode, when error goes unhandled, throw exception
            // The silverlight error object is particular about what fields you can access depending on the type of the error.
            // Accessing an inappropriate field will cause an error.
            else {
                var xamlError = errorEventArgs.get_error(),
                    errorType = xamlError.errorType,
                    errorCode = xamlError.errorCode,
                    errorMessage = xamlError.errorMessage,
                    id = this.get_id(),
                    lineNumber = "", charPosition = "", xamlFile = "", methodName = "",
                    errorFormat = Ee.UI.Xaml.Res.otherError;
                // not all the elements are available for all error types (you get an exception if you try)
                if (errorType === "ParserError") {
                    errorFormat = Ee.UI.Xaml.Res.parserError;
                    lineNumber = xamlError.lineNumber;
                    charPosition = xamlError.charPosition;
                    xamlFile = xamlError.xamlFile;
                }
                else if ((errorType === "ImageError" || errorType === "MediaError") && errorMessage === "AG_E_NOT_FOUND") {
                        errorFormat = Ee.UI.Xaml.Res.mediaError_NotFound;
                        errorMessage = sender.Source;
                }
                else if (errorType === "RuntimeError") {
                    if (xamlError.lineNumber) {
                        errorFormat = Ee.UI.Xaml.Res.runtimeErrorWithPosition;
                        lineNumber = xamlError.lineNumber;
                        charPosition = xamlError.charPosition;
                        methodName = xamlError.methodName;
                    }
                    else {
                        errorFormat = Ee.UI.Xaml.Res.runtimeErrorWithoutPosition;
                        methodName = xamlError.methodName;
                    }
                }
                throw Error.invalidOperation(
                    String.format(errorFormat, id, errorType, errorCode, errorMessage, lineNumber, charPosition, methodName, xamlFile));
            }
        }
    }

    function Ee$UI$Xaml$Control$_raiseXamlInitialize() {
        if (this.get_scaleMode() !== Ee.UI.Xaml.ScaleMode.none) {
            this._ensureTransform();
        }
        this._xamlInitialized = true;
        this.xamlInitialize();
        var handler = this.get_events().getHandler('xamlInitialized');
        if (handler) {
            handler(this, Sys.EventArgs.Empty);
        }
    }

    function Ee$UI$Xaml$Control$_xamlError(sender, args) {
        var element = this.get_element();
        if (element) {
            // DevDiv Bugs 125915: may have been disposed by now. SL calls us even though we unhook.
            this._raiseXamlError(sender, new Ee.UI.Xaml.ErrorEventArgs(args));
        }
    }

    function Ee$UI$Xaml$Control$_xamlLoaded() {
        var element = this.get_element();
        if (element) {
            // DevDiv Bugs 125915: may have been disposed by now. SL calls us even though we unhook.
            element.OnLoad = null;
            this._raiseXamlInitialize();
        }
    }
Ee.UI.Xaml.Control.prototype = {
    _xamlSource: null,
    _xamlInitialized: false,
    _scaleMode: Ee.UI.Xaml.ScaleMode.none,
    _resizeDelegate: null,
    _boundEvents: null,
    
    add_xamlError: Ee$UI$Xaml$Control$add_xamlError,
    remove_xamlError: Ee$UI$Xaml$Control$remove_xamlError,

    add_resize: Ee$UI$Xaml$Control$add_resize,
    remove_resize: Ee$UI$Xaml$Control$remove_resize,

    add_xamlInitialized: Ee$UI$Xaml$Control$add_xamlInitialized,
    remove_xamlInitialized: Ee$UI$Xaml$Control$remove_xamlInitialized,

    get_scaleMode: Ee$UI$Xaml$Control$get_scaleMode,
    set_scaleMode: Ee$UI$Xaml$Control$set_scaleMode,
    
    
    get_xamlSource: Ee$UI$Xaml$Control$get_xamlSource,
    set_xamlSource: Ee$UI$Xaml$Control$set_xamlSource,
    
    addEventListener: Ee$UI$Xaml$Control$addEventListener,
    
    addEventListeners: Ee$UI$Xaml$Control$addEventListeners,
    
    dispose: Ee$UI$Xaml$Control$dispose,    
    
    initialize: Ee$UI$Xaml$Control$initialize,

    onResize: Ee$UI$Xaml$Control$onResize,
    
    onXamlError: Ee$UI$Xaml$Control$onXamlError,
    
    xamlDispose: Ee$UI$Xaml$Control$xamlDispose,

    xamlInitialize: Ee$UI$Xaml$Control$xamlInitialize,
    
    _ensureTransform: Ee$UI$Xaml$Control$_ensureTransform,

    _onResize: Ee$UI$Xaml$Control$_onResize,
    
    _raiseXamlError: Ee$UI$Xaml$Control$_raiseXamlError,
    
    _raiseXamlInitialize: Ee$UI$Xaml$Control$_raiseXamlInitialize,

    _xamlError: Ee$UI$Xaml$Control$_xamlError,
    
    _xamlLoaded: Ee$UI$Xaml$Control$_xamlLoaded
}

Ee.UI.Xaml.Control._computeScale = function Ee$UI$Xaml$Control$_computeScale(element) {
    // Calculates the scale of a xamlElement in relation to the Silverlight host.
    // used for autoScale and lockAspectRatio
    var width = element.width;
    var height = element.height;
    var host = element.getHost();
    var x = width ? (host.content.ActualWidth / width) : 0;
    var y = height ? (host.content.ActualHeight / height) : 0;
    return { horizontal: x, vertical: y };
}
Ee.UI.Xaml.Control._ensureScale = function Ee$UI$Xaml$Control$_ensureScale(el, x, y) {
    var transform = el.RenderTransform;
    if (!transform) {
        el.RenderTransform = transform = el.getHost().content.createFromXaml('<ScaleTransform ScaleX="1" ScaleY="1"/>');
    }
    else if (transform.toString() !== "ScaleTransform") {
        throw Error.invalidOperation(Ee.UI.Xaml.Res.scaleModeRequiresScaleTransform);
    }
    transform.ScaleX = x;
    transform.ScaleY = y;
}
Ee.UI.Xaml.Control._ensureMatrix = function Ee$UI$Xaml$Control$_ensureMatrix(el, xScale, yScale, xOffset, yOffset) {
    var transform = el.RenderTransform;
    if (!transform) {
        el.RenderTransform = transform = el.getHost().content.createFromXaml('<MatrixTransform Matrix="1.0,0.0, 0.0,1.0, 0.0,0.0"/>');
    }
    else if (transform.toString() !== "MatrixTransform") {
        throw Error.invalidOperation(Ee.UI.Xaml.Res.scaleModeRequiresScaleTransform); 
    }
    transform.Matrix.M11 = xScale;
    transform.Matrix.M22 = yScale;
    transform.Matrix.OffsetX = xOffset;
    transform.Matrix.OffsetY = yOffset;
}
Ee.UI.Xaml.Control.registerClass("Ee.UI.Xaml.Control", Sys.UI.Control);
Ee.UI.Xaml.ErrorEventArgs = function Ee$UI$Xaml$ErrorEventArgs(xamlError) {
    /// <param name="xamlError"></param>
    var e = Function._validateParams(arguments, [
        {name: "xamlError"}
    ]);
    if (e) throw e;

    this._xamlError = xamlError;
    Ee.UI.Xaml.ErrorEventArgs.initializeBase(this);
}



    function Ee$UI$Xaml$ErrorEventArgs$get_error() {
        /// <value></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._xamlError;
    }
Ee.UI.Xaml.ErrorEventArgs.prototype = {
    _xamlError: null,
    
    get_error: Ee$UI$Xaml$ErrorEventArgs$get_error
}
Ee.UI.Xaml.ErrorEventArgs.registerClass("Ee.UI.Xaml.ErrorEventArgs", Sys.CancelEventArgs);



Type.registerNamespace('Ee.UI.Xaml.Media');

Ee.UI.Xaml.Media.PlayerElementName  = {
    videoWindow             : "VideoWindow",              // the <mediaelement>
    placeholderImage        : "PlaceholderImage",         // Displays the placeholder image prior to the media loading
    playerControls          : "PlayerControls",           // area encompassing all player controls
    playButton              : "PlayButton",               // a play button
    playPauseButton         : "PlayPauseButton",          // a play/pause toggle button (requires PlaySymbol & PauseSymbol)
    playSymbol              : "PlaySymbol",               // part of play/pause button, represents symbol showing for "play"
    pauseSymbol             : "PauseSymbol",              // part of play/pause button, represents symbol showing for "pause"
    stopSymbol              : "StopSymbol",              //
    stopButton              : "StopButton",               // the stop button
    pauseButton             : "PauseButton",              // the pause button
    nextButton              : "NextButton",               // the next button (next chapter)
    previousButton          : "PreviousButton",           // the previous button (prev chapter)
    muteButton              : "MuteButton",               // mute button
    muteOnSymbol            : "MuteOnSymbol",             // adornment to show on MuteButton when audio muted
    muteOffSymbol           : "MuteOffSymbol",            // adornment to show on MuteButton when audio enabled
    timeSlider              : "TimeSlider",               // the scrub bar
    timeThumb               : "TimeThumb",                // the play head
    timeCompleted           : "TimeCompleted",            // indicator on slider showing how much time is completed
    volumeSlider            : "VolumeSlider",             // the volume slider bar
    volumeThumb             : "VolumeThumb",              // the volume slider thumb control
    volumeUpButton          : "VolumeUpButton",           // a button to make the volume increase
    volumeDownButton        : "VolumeDownButton",         // a button to make the volume decrease
    totalTimeText           : "TotalTimeText",            // the text area for total duration of video
    currentTimeText         : "CurrentTimeText",          // the text area for the current media time
    downloadSlider          : "DownloadProgressSlider",   // slider to show download progress
    downloadText            : "DownloadProgressText",     // text to show download progress
    bufferingArea           : "BufferingArea",            // canvas that contains buffering feedback UI
    bufferingText           : "BufferingText",            // text to show buffering progress
    fullScreenButton        : "FullScreenButton",         // button to show video full screen
    chapterArea             : "ChapterArea",              // encasing chapters area
    chapterToggleButton     : "ChapterToggleButton",      // toggles the chapter list
    chapterScroll           : "ChapterScroll",            // chapters scroll region
    chapterPrev             : "ChapterScrollPrevious",    // control to scroll chapters to next
    chapterNext             : "ChapterScrollNext",        // control to scroll chapters to previous
    chapterItem             : "ChapterScrollItem",        // item signifying video item
    captionText             : "CaptionText",              // TextBlock to show closed captions in    
    captionArea             : "CaptionArea",              // Background of CaptionText 
    captionToggleButton     : "CaptionToggleButton",      // Toggles closed captions
    captionOnSymbol         : "CaptionOnSymbol",          // adornment to show on CaptionButton when captions on
    captionOffSymbol        : "CaptionOffSymbol",         // adornment to show on CaptionButton when captions off
    fullScreenArea          : "FullScreenArea",           // enabled when player switches to FS
    fullScreenVideoWindow   : "FullScreenVideoWindow",    // video window used for fullscreen mode
    fullScreenCaptionText   : "FullScreenCaptionText",    // mirror of captions for fullscreen mode
    fullScreenCaptionArea   : "FullScreenCaptionArea"     // mirror of captions for fullscreen mode
};
Ee.UI.Xaml.Media._DomElement = function Ee$UI$Xaml$Media$_DomElement(host, nameElement) {
    // <summary>Represents a XAML Element</summary>
    // <param name="host">Silverlight host</param>
    // <param name="nameElement" type="String">Name of XAML canvas which represents the element</param>
    this._control = host.content.findName(nameElement);
    if (this._control) {
        this.bindEvent("mouseEnter", nameElement + "_MouseEnter");
        this.bindEvent("mouseLeave", nameElement + "_MouseLeave");
        this._showAnimation = this._control.findName(nameElement + "_Show");
        this._hideAnimation = this._control.findName(nameElement + "_Hide");
        this._enableAnimation = this._control.findName(nameElement + "_Enable");
        this._disableAnimation = this._control.findName(nameElement + "_Disable");
    }
}

    function Ee$UI$Xaml$Media$_DomElement$get_control() {
        if (arguments.length !== 0) throw Error.parameterCount();
        // <value>The underlying XAML control</value>
        return this._control;
    }

    function Ee$UI$Xaml$Media$_DomElement$get_enabled() {
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._enabled;
    }
    function Ee$UI$Xaml$Media$_DomElement$set_enabled(value) {
        if (value !== this.get_enabled()) {
            // e.g. might make the control look grayed out or increase its alpha
            var anim = value ? this._enableAnimation : this._disableAnimation;
            if (anim) anim.begin();
            this._enabled = value;
        }
    }

    function Ee$UI$Xaml$Media$_DomElement$bindEvent(eventName, animationName, callback, callbackOwner) {
        // helper that reduces code necessary to bind a xaml event to a function and have it play an animation by name
        // if set_enabled(false) is called, animations stop playing and callbacks aren't called. For example, a disabled button does nothing.
        if (animationName || callback) {
            var animation = null;
            if (animationName) animation = this._control.findName(animationName);
            
            // no animation found and theres no callback, no reason to hook the event
            if (!animation && !callback) return;
            
            if (!this._boundEvents) this._boundEvents = [];

            if (callback) {
                callback = Function.createDelegate(callbackOwner || this, callback);
            }
            
            var _this = this;
            function handleEvent(sender, args) {
                if (!_this.get_enabled()) return;
                if (callback && !callback(sender, args)) return;
                if (animation) animation.begin();
            }
            
            var token = this._control.addEventListener(eventName, handleEvent);
            this._boundEvents[this._boundEvents.length] = { eventName: eventName, token: token };
        }
    }

    function Ee$UI$Xaml$Media$_DomElement$dispose() {
        if (this._control) {
            if (this._boundEvents) {
                for (var i = 0, l = this._boundEvents.length; i < l; i++) {
                    var e = this._boundEvents[i];
                    this._control.removeEventListener(e.eventName, e.token);
                }
                this._boundEvents = null;
            }
                    
            this._showAnimation = null;
            this._hideAnimation = null;
            this._enableAnimation = null;
            this._disableAnimation = null;
            this._control = null;
        }
    }

    function Ee$UI$Xaml$Media$_DomElement$setVisible(value) {
        var anim = value ? this._showAnimation : this._hideAnimation;
        if (anim) {
            anim.begin();
        }
        else if (this._control) {
            this._control.visibility = value ? 0 : 1;
        }
    }
Ee.UI.Xaml.Media._DomElement.prototype = {
    _control: null,
    _boundEvents: null,
    _showAnimation: null,
    _hideAnimation: null,
    _enableAnimation: null,
    _disableAnimation: null,
    _enabled: true,
    
    get_control: Ee$UI$Xaml$Media$_DomElement$get_control,

    get_enabled: Ee$UI$Xaml$Media$_DomElement$get_enabled,
    set_enabled: Ee$UI$Xaml$Media$_DomElement$set_enabled,

    bindEvent: Ee$UI$Xaml$Media$_DomElement$bindEvent,
    
    dispose: Ee$UI$Xaml$Media$_DomElement$dispose,
    
    setVisible: Ee$UI$Xaml$Media$_DomElement$setVisible
}
Ee.UI.Xaml.Media._DomElement.registerClass('Ee.UI.Xaml.Media._DomElement', null, Sys.IDisposable);

Ee.UI.Xaml.Media._Button = function Ee$UI$Xaml$Media$_Button(host, nameElement, autoRepeatInterval,
                                            clickHandler, doubleClickHandler, handlerOwner, requiresSender) {
    
    Ee.UI.Xaml.Media._Button.initializeBase(this, [host, nameElement]);
    this._repeatInterval = autoRepeatInterval || 0;
    
    var control = this.get_control();
    if (control) {
        control.cursor = "Hand";
        this.bindEvent("mouseLeftButtonDown", nameElement + "_MouseDown", this._mouseDown);
        this.bindEvent("mouseLeftButtonUp", nameElement + "_MouseUp", this._mouseUp);
        this.bindEvent("mouseLeave", nameElement + "_MouseUp", this._mouseLeave);
    }
    if (handlerOwner) {
        // some button handlers are wired directly into public methods that dont take parameters.
        // others are private methods that need to know the button instance clicked.
        this._requiresSender = !!requiresSender;
        this._clickDelegate = Function.createDelegate(handlerOwner, clickHandler);
        if (doubleClickHandler) {
            this._doubleClickDelegate = Function.createDelegate(handlerOwner, doubleClickHandler);
        }
    }
}









    function Ee$UI$Xaml$Media$_Button$set_enabled(value) {
        Ee.UI.Xaml.Media._Button.callBaseMethod(this, "set_enabled", [value]);
        var c = this.get_control();
        if (c) c.cursor = value ? "Hand" : "Default";
    }

	function Ee$UI$Xaml$Media$_Button$dispose() {
	    this._cancelRepeat();
	    this._clickDelegate = null;
	    this._doubleClickDelegate = null;
        Ee.UI.Xaml.Media._Button.callBaseMethod(this, 'dispose');                
    }

    function Ee$UI$Xaml$Media$_Button$_cancelRepeat() {
        if (!this._repeatTimeout) return;
        window.clearTimeout(this._repeatTimeout);
        this._repeatTimeout = null;
        this._repeatClickDelegate = null;
    }

    function Ee$UI$Xaml$Media$_Button$_doClick(isDouble) {
        if (isDouble && this._doubleClickDelegate) {
            this._requiresSender ? this._doubleClickDelegate(this) : this._doubleClickDelegate();
        }
        else if (this._clickDelegate) {
            this._requiresSender ? this._clickDelegate(this) : this._clickDelegate();
        }
    }

    function Ee$UI$Xaml$Media$_Button$_mouseDown() {
        this._down = true;
        if (this._repeatInterval && !this._repeatTimeout) {
            // click immediately when it will be repeating,
            // otherwise we don't until leftbuttonup
            this._doClick(false);
            this._repeatClickDelegate = Function.createDelegate(this, this._repeatClick);
            this._repeatTimeout = window.setTimeout(this._repeatClickDelegate, this._repeatInterval);
        }
        return true;
    }

    function Ee$UI$Xaml$Media$_Button$_mouseLeave() {
        if (!this._down) {
            // we're not already down, so cancel the mouseup animation
            return false;
        }
        this._down = false;
        this._cancelRepeat();
        return true;
    }

    function Ee$UI$Xaml$Media$_Button$_mouseUp() {
        this._down = false;

        if (this._repeatTimeout) {
            this._cancelRepeat();
        }
        else {
            var tmNow = new Date().getTime();
            var last = this._timeLastLeftButtonUp;
            this._timeLastLeftButtonUp = tmNow;
            var doubleClick = last && ((tmNow - last) < 300);
            if (doubleClick) {
                // so a 3rd click won't result in another double click
                this._timeLastLeftButtonUp = 0;
            }
            this._doClick(doubleClick);
        }
        return true;
    }

    function Ee$UI$Xaml$Media$_Button$_repeatClick() {
        this._repeatTimeout = window.setTimeout(this._repeatClickDelegate, this._repeatInterval);
        this._doClick(false);
    }
    
Ee.UI.Xaml.Media._Button.prototype = {
    _down: false,
    _repeatInterval: 0,
    _repeatTimeout: null,
    _repeatClickDelegate: null,
    _timeLastLeftButtonUp: 0,
    _clickDelegate: null,
    _doubleClickDelegate: null,
    
    set_enabled: Ee$UI$Xaml$Media$_Button$set_enabled,
    
	dispose: Ee$UI$Xaml$Media$_Button$dispose,

    _cancelRepeat: Ee$UI$Xaml$Media$_Button$_cancelRepeat,

    _doClick: Ee$UI$Xaml$Media$_Button$_doClick,

    _mouseDown: Ee$UI$Xaml$Media$_Button$_mouseDown,
    
    _mouseLeave: Ee$UI$Xaml$Media$_Button$_mouseLeave,
    
    _mouseUp: Ee$UI$Xaml$Media$_Button$_mouseUp,

    _repeatClick: Ee$UI$Xaml$Media$_Button$_repeatClick
}

Ee.UI.Xaml.Media._Button.registerClass('Ee.UI.Xaml.Media._Button', Ee.UI.Xaml.Media._DomElement);

Ee.UI.Xaml.Media.Player = function Ee$UI$Xaml$Media$Player(domElement) {
    /// <param name="domElement"></param>
    var e = Function._validateParams(arguments, [
        {name: "domElement"}
    ]);
    if (e) throw e;

    Ee.UI.Xaml.Media.Player.initializeBase(this, [domElement]);
    // default scale mode for a media player
    this.set_scaleMode(Ee.UI.Xaml.ScaleMode.zoom);
}

function Ee$UI$Xaml$Media$Player$add_chapterStarted(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler("chapterStarted", handler);
    }
function Ee$UI$Xaml$Media$Player$remove_chapterStarted(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("chapterStarted", handler);
    }

function Ee$UI$Xaml$Media$Player$add_markerReached(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler("markerReached", handler);
    }
function Ee$UI$Xaml$Media$Player$remove_markerReached(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("markerReached", handler);
    }

function Ee$UI$Xaml$Media$Player$add_mediaEnded(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler("mediaEnded", handler);
    }
function Ee$UI$Xaml$Media$Player$remove_mediaEnded(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("mediaEnded", handler);
    }

function Ee$UI$Xaml$Media$Player$add_mediaFailed(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler("mediaFailed", handler);
    }
function Ee$UI$Xaml$Media$Player$remove_mediaFailed(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("mediaFailed", handler);
    }

function Ee$UI$Xaml$Media$Player$add_mediaOpened(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;
        this.get_events().addHandler("mediaOpened", handler);
    }
function Ee$UI$Xaml$Media$Player$remove_mediaOpened(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("mediaOpened", handler);
    }

function Ee$UI$Xaml$Media$Player$add_stateChanged(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler("stateChanged", handler);
    }
function Ee$UI$Xaml$Media$Player$remove_stateChanged(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("stateChanged", handler);
    }

function Ee$UI$Xaml$Media$Player$add_volumeChanged(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().addHandler("volumeChanged", handler);
    }
function Ee$UI$Xaml$Media$Player$remove_volumeChanged(handler) {
    var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
    if (e) throw e;

        this.get_events().removeHandler("volumeChanged", handler);
    }

function Ee$UI$Xaml$Media$Player$get_autoPlay() {
        /// <value type="Boolean"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (this._mediaElement) return this._mediaElement.AutoPlay;
        if (this._autoPlay !== null) return this._autoPlay;
        return false;
    }
function Ee$UI$Xaml$Media$Player$set_autoPlay(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Boolean}]);
        if (e) throw e;

        if (this._mediaElement) {
            this._mediaElement.AutoPlay = value;
        }
        else {
            this._autoPlay = value;
        }
    }

function Ee$UI$Xaml$Media$Player$get_caption() {
        /// <value type="String"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._caption || "";
    }
function Ee$UI$Xaml$Media$Player$set_caption(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: String}]);
        if (e) throw e;

        this._caption = value;
        if (this._captionArea) {
            this._captionArea.set_text(value);
        }
        if (this._captionAreaFS) {
            this._captionAreaFS.set_text(value);
        }
    }

function Ee$UI$Xaml$Media$Player$get_chapters() {
        /// <value type="Array"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (!this._chapters) return [];
        return Array.clone(this._chapters);
    }
function Ee$UI$Xaml$Media$Player$set_chapters(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Array}]);
        if (e) throw e;

        this._chapters = value;
        if (this._chapterArea) {
            this._loadChapters(value);
        }
    }

function Ee$UI$Xaml$Media$Player$get_currentChapter() {
        /// <value type="Number"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._currentChapter;
    }
function Ee$UI$Xaml$Media$Player$set_currentChapter(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Number}]);
        if (e) throw e;

        var chapters = this.get_chapters();
        if (!chapters || value < 0 || value >= chapters.length) {
            throw Error.argumentOutOfRange("currentChapter", value, Ee.UI.Xaml.Media.Res.invalidChapterIndex);
        }
        var newTime = chapters[value].time;
        if (newTime !== -1) {
            this.set_timeIndex(newTime);
        }
    }

    function Ee$UI$Xaml$Media$Player$get_enableCaptions() {
        /// <value type="Boolean"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return !!this._enableCaptions;
    }
    function Ee$UI$Xaml$Media$Player$set_enableCaptions(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Boolean}]);
        if (e) throw e;

        if (this._enableCaptions !== value) {
            this._enableCaptions = value;
            this._ensureCaption();
        }
    }

    function Ee$UI$Xaml$Media$Player$get_mediaMarkers() {
        /// <value type="Array"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (!this._mediaMarkers) return [];
        return Array.clone(this._mediaMarkers);
    }

    function Ee$UI$Xaml$Media$Player$get_mediaElement() {
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._mediaElement || null;
    }

    function Ee$UI$Xaml$Media$Player$get_mediaUrl() {
        /// <value type="String"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (this._mediaElement) return this._mediaElement.Source || "";
        return this._mediaUrl || "";
    }
    function Ee$UI$Xaml$Media$Player$set_mediaUrl(value) {    
        var e = Function._validateParams(arguments, [{name: "value", type: String}]);
        if (e) throw e;

        if (this._mediaElement) {
            this._loadPlaceholderImage();
            this._loadMediaUrl(value);
        }
        else {
            this._mediaUrl = value;
        }
    }

    function Ee$UI$Xaml$Media$Player$get_muted() {
        /// <value type="Boolean"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (this._mediaElement) return this._mediaElement.IsMuted;
        return !!this._muted;
    }
    function Ee$UI$Xaml$Media$Player$set_muted(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Boolean}]);
        if (e) throw e;

        if (value !== this.get_muted()) {
            if (this._mediaElement) {
                this._mediaElement.IsMuted = value;
                this._muteButton.set_state(value ? 1 : 0);
            }
            else {
                this._muted = value;
            }
            if (!this.get_isUpdating()) {
                this._raiseVolumeChanged(Sys.EventArgs.Empty);
            }
        }
    }

    function Ee$UI$Xaml$Media$Player$get_placeholderImage() {
        /// <value type="String" mayBeNull="true"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._placeholderImage || "";
    }
    function Ee$UI$Xaml$Media$Player$set_placeholderImage(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: String, mayBeNull: true}]);
        if (e) throw e;

        this._placeholderImage = value;
    }

    function Ee$UI$Xaml$Media$Player$get_playState() {
        /// <value type="String"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._mediaElement ? this._mediaElement.CurrentState : "Stopped";
    }

    function Ee$UI$Xaml$Media$Player$get_timeIndex() {
        /// <value type="Number"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._mediaElement ? this._mediaElement.position.seconds : 0;
    }
    function Ee$UI$Xaml$Media$Player$set_timeIndex(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Number}]);
        if (e) throw e;

        if(this._mediaElement && this._canSeek) {
            this._mediaEnded = false;
            this.set_caption("");
            // restrict to within 0 and naturalduration
            value = Math.max(0, value);
            value = Math.min(this._naturalduration, value);
            var position = this._mediaElement.position;
            position.seconds = value;
	        this._mediaElement.position = position;            
            // update ui and detect chapter changing
            this._updateTime(value);
            this._currentChapter = this._getChapterAt(value, true);
            this._detectChapterChanged();
        }
    }

    function Ee$UI$Xaml$Media$Player$get_volume() {
        /// <value type="Number"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (this._volume !== null) return this._volume;
        if (this._mediaElement) return this._mediaElement.volume;
        return Ee.UI.Xaml.Media.Player._defaultVolume;
    }
    function Ee$UI$Xaml$Media$Player$set_volume(value) {
        var e = Function._validateParams(arguments, [{name: "value", type: Number}]);
        if (e) throw e;

        if (value < 0 || value > 1) {
            throw Error.argumentOutOfRange("value", value, Ee.UI.Xaml.Media.Res.volumeRange);
        }
        if (value !== this.get_volume()) {
            if (this._mediaElement && this._mediaElement.CurrentState !== "Closed") {
                this._mediaElement.volume = value;
            }
            else {
                this._volume = value;
            }
            if (!this.get_isUpdating()) {
                this._raiseVolumeChanged(Sys.EventArgs.Empty);
            }
        }

        if (this._dragVolume) this._dragVolume.set_value(value);
    }

    function Ee$UI$Xaml$Media$Player$nextChapter() {
        /// <returns type="Boolean"></returns>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (!this._canSeek) return false;
        var chapters = this.get_chapters();
        if (chapters) {
            var i = this.get_currentChapter();
            if (++i < chapters.length) {
                this.set_currentChapter(i);
                return true;
            }
        }
        return false;
    }

    function Ee$UI$Xaml$Media$Player$onChapterStarted(chapterEventArgs) {
        /// <param name="chapterEventArgs" type="Ee.UI.Xaml.Media.ChapterEventArgs"></param>
        var e = Function._validateParams(arguments, [
            {name: "chapterEventArgs", type: Ee.UI.Xaml.Media.ChapterEventArgs}
        ]);
        if (e) throw e;

    }

    function Ee$UI$Xaml$Media$Player$onMarkerReached(args) {
        /// <param name="args" type="Ee.UI.Xaml.Media.MarkerEventArgs"></param>
        var e = Function._validateParams(arguments, [
            {name: "args", type: Ee.UI.Xaml.Media.MarkerEventArgs}
        ]);
        if (e) throw e;

    }

    function Ee$UI$Xaml$Media$Player$onPlayStateChanged(stateChangedEventArgs) {
        /// <param name="stateChangedEventArgs" type="Ee.UI.Xaml.Media.StateChangedEventArgs"></param>
        var e = Function._validateParams(arguments, [
            {name: "stateChangedEventArgs", type: Ee.UI.Xaml.Media.StateChangedEventArgs}
        ]);
        if (e) throw e;

    }

    function Ee$UI$Xaml$Media$Player$onVolumeChanged(args) {
        /// <param name="args" type="Sys.EventArgs"></param>
        var e = Function._validateParams(arguments, [
            {name: "args", type: Sys.EventArgs}
        ]);
        if (e) throw e;

    }

    function Ee$UI$Xaml$Media$Player$pause() {
        if (arguments.length !== 0) throw Error.parameterCount();
        if (!this._mediaElement) throw Error.invalidOperation(Ee.UI.Xaml.Media.Res.noMediaElement);
        if (!this._mediaOpened) return;
	    this._mediaElement.pause();
    }

    function Ee$UI$Xaml$Media$Player$play() {
        if (arguments.length !== 0) throw Error.parameterCount();
        if (!this._mediaElement) throw Error.invalidOperation(Ee.UI.Xaml.Media.Res.noMediaElement);
        if (!this._mediaOpened) return;
        this.set_caption("");
        var me = this._mediaElement;
        if (this._mediaEnded) {
            // user has hit play but the media already played to the end.
            // SL doesn't automatically rewind, so we must call stop first so it starts over.
            me.stop();
            this._mediaEnded = false;
            // we must play from a settimeout because SL doesnt always respond to stop then play immediatley after
            window.setTimeout(function() { me.play(); }, 0);
        }
        else {
            me.play();
        }
    }

    function Ee$UI$Xaml$Media$Player$previousChapter() {
        /// <returns type="Boolean"></returns>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (!this._canSeek) return false;
        var chapters = this.get_chapters();
        if (chapters) {
            var i = this.get_currentChapter();
            if (--i >= 0) {
                this.set_currentChapter(i);
                return true;
            }
        }
        return false;
    }

    function Ee$UI$Xaml$Media$Player$stop() {
        if (arguments.length !== 0) throw Error.parameterCount();
        if (!this._mediaElement) throw Error.invalidOperation(Ee.UI.Xaml.Media.Res.noMediaElement);
        if (!this._mediaOpened) return;
        this._mediaEnded = false;
        this._currentChapter = this._getChapterAt(0, true);
	    this._mediaElement.stop();
	    this.set_caption("");
    }

    function Ee$UI$Xaml$Media$Player$toggleMuted() {
        /// <returns type="Boolean"></returns>
        if (arguments.length !== 0) throw Error.parameterCount();
        var v = !this.get_muted();
        this.set_muted(v);
        return v;
    }

    function Ee$UI$Xaml$Media$Player$togglePlayPause() {
        /// <returns type="String"></returns>
        if (arguments.length !== 0) throw Error.parameterCount();
        if (this._mediaElement.canPause) {
            this.get_playState() === "Playing" ? this.pause() : this.play();
        } else {
            this.get_playState() === "Playing" ? this.stop() : this.play();
        }
        
        return this.get_playState();
    }

    function Ee$UI$Xaml$Media$Player$xamlDispose() {
        if (this._timerCookie) {
            window.clearTimeout(this._timerCookie);
            this._timerCookie = null;
        }
        if (this._domElements) {
            for (var i = 0, l = this._domElements.length; i < l; i++) {
                this._domElements[i].dispose();
            }
            delete this._domElements;
        }

        // player should not continue playing after disposed
        // safe to call stop in any state
        if (this._mediaElement) this._mediaElement.stop();
        // remove direct references to xaml elements
        this._mediaElement = null;
        this._bufferingText = null;
        this._bufferingStoryboard = null;
        
        var content = this.get_element() ? this.get_element().content : null;
        if (content) {
            content.onFullScreenChange = null;
        }
        
        Ee.UI.Xaml.Media.Player.callBaseMethod(this, "xamlDispose");        
    }

    function Ee$UI$Xaml$Media$Player$xamlInitialize() {
        // search and create controls for well named XAML elements
        this._bindChildControls(); 
        Ee.UI.Xaml.Media.Player.callBaseMethod(this, 'xamlInitialize');
        
        var chapters = this.get_chapters();
        if (chapters) {
            this._loadChapters(chapters);
        }
        
        if (this._mediaUrl === null) {
            // no initial media means you can't seek
            this._ensureSeeking(false);
            // disable play, pause, stop, etc
	        this._mediaAvailable(false);
	    }
        this._loadPlaceholderImage();	    
        this._clearMediaCache();
    }

    function Ee$UI$Xaml$Media$Player$_bindChildControls() {
        var names = Ee.UI.Xaml.Media.PlayerElementName,
            host = this.get_element(),
            btn = Ee.UI.Xaml.Media._Button,
            domEl = Ee.UI.Xaml.Media._DomElement,
            sldr = Ee.UI.Xaml.Media._Slider,
            mbtn = Ee.UI.Xaml.Media._MultiStateButton,
            tb = Ee.UI.Xaml.Media._TextBlock;
        
        var mediaDomElement;
        this._domElements = [
            mediaDomElement = new btn(host, names.videoWindow, null, this.togglePlayPause, this._onFullScreenME, this),
            this._fsCanvas = new btn(host, names.fullScreenArea, null, this.togglePlayPause, this._onFullScreenME, this),
            this._fsVideoWindow = new domEl(host, names.fullScreenVideoWindow),
            this._bufferingProgress = new domEl(host, names.bufferingArea),
            new domEl(host, names.playerControls),
            // buttons
            this._playButton = new btn(host, names.playButton, null, this.play, null, this),
            this._stopButton = new btn(host, names.stopButton, null, this.stop, null, this),
            this._pauseButton = new btn(host, names.pauseButton, null, this.pause, null, this),
            new btn(host, names.volumeUpButton, 20, this._onVolumeUp, null, this),
            new btn(host, names.volumeDownButton, 20, this._onVolumeDown, null, this),
            new btn(host, names.fullScreenButton, null, this._onFullScreen, null, this),
            this._previousButton = new btn(host, names.previousButton, null, this._chapterPrevious, null, this),
            this._nextButton = new btn(host, names.nextButton, null, this._chapterNext, null, this),
            this._playPauseButton = new mbtn(host, names.playPauseButton, null, this.togglePlayPause, null, this, names.playSymbol, names.pauseSymbol, names.stopSymbol),
            this._muteButton = new mbtn(host, names.muteButton, null, this.toggleMuted, null, this, names.muteOffSymbol, names.muteOnSymbol),
            // time slider
            this._dragTime = new sldr(host, names.timeThumb, names.timeSlider, this._onTimeSliderChanged, this),
            // volume slider
            this._dragVolume = new sldr(host, names.volumeThumb, names.volumeSlider, this._onVolumeSliderChanged, this),
            // time
            this._totalTimeText = new tb(host, names.totalTimeText),
            this._currentTimeText = new tb(host, names.currentTimeText),
            this._downloadProgress = new Ee.UI.Xaml.Media._ProgressBar(host, names.downloadSlider, names.downloadText),
            // chapter area        
            this._chapterArea = new Ee.UI.Xaml.Media._ChapterArea(this),
            // caption area
            this._captionArea = new tb(host, names.captionText, names.captionArea),
            this._captionAreaFS = new tb(host, names.fullScreenCaptionText, names.fullScreenCaptionArea),
            // toggle captions on/off
            this._captionButton = new mbtn(host, names.captionToggleButton, null, this._onCaptionToggle, null, this, names.captionOnSymbol, names.captionOffSymbol),
            // placeholder image
            this._imageElement = new domEl(host, names.placeholderImage)
        ];

        mediaDomElement.bindEvent("mediaOpened", null, this._meMediaOpened, this);
        mediaDomElement.bindEvent("mediaFailed", null, this._meMediaFailed, this);
        mediaDomElement.bindEvent("mediaEnded", null, this._meMediaEnded, this);
        mediaDomElement.bindEvent("downloadProgressChanged", null, this._meDownloadProgress, this);
        mediaDomElement.bindEvent("bufferingProgressChanged", null, this._meBufferingProgress, this);
        mediaDomElement.bindEvent("markerReached", null, this._meMarkerReached, this);
        mediaDomElement.bindEvent("currentStateChanged", null, this._meStateChanged, this);

        // UI for buffering feedback        
        this._bufferingStoryboard = host.content.findName(names.bufferingArea + "_Buffering");
        this._bufferingText = host.content.findName(names.bufferingText);

        this._dragVolume.set_value(this.get_volume());

        // full screen event
        host.content.onFullScreenChange = Function.createDelegate(this, this._fullScreenChanged);
        
        this._mediaElement = mediaDomElement.get_control();
        if (!this._mediaElement) {
            throw Error.invalidOperation(Ee.UI.Xaml.Media.Res.noMediaElement);
        }
        this._mediaElement.AutoPlay = false;
    }

    function Ee$UI$Xaml$Media$Player$_chapterNext() {
        var chapters = this.get_chapters();
        if (!chapters || !chapters.length) {
            // if there are no chapters, the next and previous buttons jump by a percentage of play time
            this._skipTime(1);
        }
        else {
            this.nextChapter();
        }
    }

    function Ee$UI$Xaml$Media$Player$_chapterPrevious() {
        var chapters = this.get_chapters();
        if (!chapters || !chapters.length) {
            // if there are no chapters, the next and previous buttons jump by a percentage of play time
            this._skipTime(-1);
        }
        else {
            // find previous chapter (don't use previousChapter() because we need to allow 1s lead time)
            // e.g. clicking the previous chapter button in the middle of chapter #X should start at the beginning of chapter #X,
            // not chapter #X-1.
            // getChapterAt will tell us which chapter is playing at the current time minus 1 second
            var newChapter = this._getChapterAt(this.get_timeIndex() - 1);
            if (newChapter === -1) {
                // 1 second ago = before the first chapter in the list
                this.set_timeIndex(0);
            }
            else {
                this.set_currentChapter(newChapter);
            }
        }
    }

    function Ee$UI$Xaml$Media$Player$_clearMediaCache() {
        // some properties can't be set until the MediaElement has content
        if (this._muted !== null) {
            this._mediaElement.IsMuted = this._muted;
            this._muteButton.set_state(this._muted ? 1 : 0);
            this._muted = null;
        }
        if (this._volume !== null) {
            this._mediaElement.Volume = this._volume;
            this._dragVolume.set_value(this._volume);
            this._volume = null;
        }
        if (this._autoPlay !== null) {
            this._mediaElement.AutoPlay = this._autoPlay;
            this._autoPlay = null;
        }
        if (this._mediaUrl !== null) {
            this._loadMediaUrl(this._mediaUrl);
            this._mediaUrl = null
        }
    }

    function Ee$UI$Xaml$Media$Player$_detectChapterChanged(currentTime) {
        if (this._lastChapterStarted !== this._currentChapter) {
            // may have skipped into a chapter
            this._lastChapterStarted = this._currentChapter;
            this._raiseChapterStarted(new Ee.UI.Xaml.Media.ChapterEventArgs(this._currentChapter));
        }
        else {
            // We think we're on the same chapter we last raised an event for. But natural progression of the media
            // or seeking operations may have put the position outside the bounds of this chapter.
            
            // DevDiv Bugs 126619: use a 0.001 second padding to prevent false chapter start detection
            if ((this._nextChapterTime !== -1 && currentTime >= (this._nextChapterTime - 0.001)) ||
                (this._currentChapterTime !== -1 && currentTime < (this._currentChapterTime - 0.001))) {
                // the time index jumped outside the bounds of the current chapter
                this._currentChapter = this._getChapterAt(currentTime, true);
                this._lastChapterStarted = this._currentChapter;
                this._raiseChapterStarted(new Ee.UI.Xaml.Media.ChapterEventArgs(this._currentChapter));
            }
        }
    }

    function Ee$UI$Xaml$Media$Player$_enableBuffering(enabled, percent) {
        if (enabled) {
            if (this._bufferingText) {
                this._bufferingText.Visibility = 0;
                this._bufferingText.Text = percent.toString();
            }
            if (!this._bufferingProgressVisible) {
                this._bufferingProgress.setVisible(true);
                if (this._bufferingStoryboard) this._bufferingStoryboard.begin();
            }
            this._bufferingProgressVisible = true;
        }
        else if (this._bufferingProgressVisible) {
            if (this._bufferingText) {
                this._bufferingText.Visibility = 1;
            }
            this._bufferingProgress.setVisible(false);
            if (this._bufferingStoryboard) this._bufferingStoryboard.stop();
            this._bufferingProgressVisible = false;
        }
    }

    function Ee$UI$Xaml$Media$Player$_ensureCaption() {
        var showCaptions = this._toggledCaptions && this.get_enableCaptions();
        if (showCaptions) {
            var caption = this.get_caption();
            if (this._captionArea) {
                this._captionArea.set_text(caption);
            }
            if (this._captionAreaFS) {
                this._captionAreaFS.set_text(caption);
            }
        }
        else {
            if (this._captionArea) {
                this._captionArea.setVisible(false);
            }
            if (this._captionAreaFS) {
                this._captionAreaFS.setVisible(false);
            }
        }
    }

    function Ee$UI$Xaml$Media$Player$_ensureChapterArea() {
        var displayChapters = this._canSeek;
        if (displayChapters) {
            var chapters = this.get_chapters();
            if (chapters) {
                // we may have chapters but none have images. In that case don't show the chapter area.
                displayChapters = false;
                for (var i = 0, l = chapters.length; i < l; i++) {
                    if (chapters[i].imageUrl) {
                        displayChapters = true;
                        break;
                    }
                }
            }
        }
        
        if (displayChapters && !this._chaptersActive) {
            this._chapterArea.activate();
            this._chaptersActive = true;
        }
        else if(!displayChapters && this._chaptersActive) {
            this._chapterArea.deactivate();
            this._chapterArea.setVisible(false);
            this._chaptersActive = false;
        }
    }

    function Ee$UI$Xaml$Media$Player$_ensureSeeking(canSeek) {
        // when media is opened that doesn't support seeking (e.g. live streams), disable seek related controls
        if (this._canSeek !== canSeek) {
            this._canSeek = canSeek;
            this._previousButton.set_enabled(canSeek);
            this._nextButton.set_enabled(canSeek);
            this._ensureChapterArea();
            // it might be that the slider should still show time progress, but not allow you to click on it to set the time
            this._dragTime.set_enableSeeking(canSeek);
        }
    }

    function Ee$UI$Xaml$Media$Player$_ensureDuration(hasDuration) {
        if (this._hasDuration !== hasDuration) {
            this._hasDuration = hasDuration;
            this._totalTimeText.setVisible(hasDuration);
            //this._currentTimeText.setVisible(hasDuration);
            // when there is no duration (e.g. live feed) the time slider is meaningless.
            this._dragTime.set_enabled(hasDuration);
        }
    }

    function Ee$UI$Xaml$Media$Player$_formatTime(time) {
    	var hours = Math.floor(time / (1000*60*60));
    	var minutes = Math.floor(time / (1000*60)) - (hours*60);
    	var seconds = Math.floor(time / 1000) - (hours*60*60) - (minutes*60);
	    var timeString = "";
    	if (hours > 0) {
    	    timeString = hours < 10 ? ("0" + hours) : ("" + hours);
    	    timeString += ":";
    	}
        timeString += minutes < 10 ? ("0" + minutes) : ("" + minutes);
	    timeString += ":";
        timeString += seconds < 10 ? ("0" + seconds) : ("" + seconds);
	    return timeString;
    }

    function Ee$UI$Xaml$Media$Player$_fullScreenChanged(sender, eventArgs) {
        var fs = this._fsCanvas.get_control();
        if (!fs) return;
        if (this.get_element().content.fullScreen) {
            var rootTransform = this.get_element().content.root.RenderTransform;
            var rootX = 1;
            var rootY = 1;
            if (rootTransform && rootTransform.toString() === "ScaleTransform") {
                rootX = rootTransform.ScaleX;
                rootY = rootTransform.ScaleY;
            }
            var s = Ee.UI.Xaml.Control._computeScale(fs);
            
            var newXScale = s.horizontal / rootX;
            var newYScale = s.vertical / rootY;
            
            Ee.UI.Xaml.Control._ensureScale(fs, newXScale, newYScale);
                        
            var fsVideoWindow = this._fsVideoWindow.get_control();                        
            if (fsVideoWindow)  {
                var minScale = Math.min(s.horizontal, s.vertical);
                var scale = Math.min(s.horizontal / rootX, s.vertical / rootY);
                var offX = (fs.getHost().content.ActualWidth-fsVideoWindow.width*minScale)/2;
                var offY = (fs.getHost().content.ActualHeight-fsVideoWindow.height*minScale)/2;
                if (newXScale>newYScale)
                    Ee.UI.Xaml.Control._ensureMatrix(fsVideoWindow, newYScale/newXScale, 1.0, offX/s.horizontal, offY/s.vertical);
                else
                    Ee.UI.Xaml.Control._ensureMatrix(fsVideoWindow, 1.0, newXScale/newYScale, offX/s.horizontal, offY/s.vertical);
            }
            fs.Visibility = 0;
        }
        else {
            fs.Visibility = 1;
        }
    }

    function Ee$UI$Xaml$Media$Player$_getChapterAt(seconds, isCurrentTime) {
        var chapters = this.get_chapters();
        var chapterIndex = -1;
        seconds += 0.001;
        if (chapters) {
            for (var i=0, l=chapters.length; i < l; i++) {
                // adjust the time 0.001, because actual chapter time is not as accurate as the time you specify.
                // If you specify a chapter to start at 5s, it might actually start at 4.999s or 5.001s, for example.
                // In other words you are considered at a chapter if you are at least within 0.001 seconds of it.
                var t = chapters[i].time - 0.001;
                if (t <= seconds) {
                    chapterIndex = i;
                }
                else {
                    break;
                }
            }
        }
        // if seconds is the current time index, we store the next chapter's start time so the timer
        // knows when to raise the chapter changed event while the video is naturally seeking forward.
        // otherwise we'd have to constantly index the chapter collection to see if the chapter changed.
        if (isCurrentTime) {
            this._currentChapterTime = (chapterIndex >= 0) ? chapters[chapterIndex].time : -1;
            this._nextChapterTime = (chapterIndex < chapters.length-1) ? chapters[chapterIndex+1].time : -1;
        }
        return chapterIndex;
    }

    function Ee$UI$Xaml$Media$Player$_getMediaFailedError() {
        var displayMessage = "Ee.UI.Xaml.Media.MediaFailedException: " +
            String.format(Ee.UI.Xaml.Media.Res.mediaFailed, this.get_mediaUrl());
        var e = Error.create(displayMessage, { name: "Ee.UI.Xaml.Media.MediaFailedException", mediaUrl: this.get_mediaUrl() });
        e.popStackFrame();
        return e;
    }

    function Ee$UI$Xaml$Media$Player$_loadChapters(chapters) {
        this._ensureChapterArea();
        this._chapterArea.setChapters(chapters);
        this._currentChapter = this._getChapterAt(this.get_timeIndex(), true);
        this._lastChapterStarted = -1;
        this._detectChapterChanged();
    }

    function Ee$UI$Xaml$Media$Player$_loadMediaUrl(url) {    
        this._currentChapter = -1;
        this._lastChapterStarted = -1;
        this._mediaElement.Source = url;
    }

    function Ee$UI$Xaml$Media$Player$_loadPlaceholderImage() {
        // show placeholder image over video
        var url = this.get_placeholderImage();
        if (url) {
            var img = this._imageElement.get_control();
            if (img) {
                img.Source = url;
                this._placeholderImageShowing = true;
                this._imageElement.setVisible(true);
            }
        }
    }

    function Ee$UI$Xaml$Media$Player$_onCaptionToggle() {
        this._toggledCaptions = !this._toggledCaptions;
        this._ensureCaption();
        this._captionButton.set_state(this._toggledCaptions ? 0 : 1);
    }

    function Ee$UI$Xaml$Media$Player$_onFullScreen() {
        var content = this.get_element().content;
        content.fullScreen = !content.fullScreen;
    }
    function Ee$UI$Xaml$Media$Player$_onFullScreenME() {
        // full screen request came from double clicking the media, which caused it to toggle play/pause
        // toggle once again to put back
        this.togglePlayPause();
        this._onFullScreen();
    }
    function Ee$UI$Xaml$Media$Player$_onTimeSliderChanged() {
        this.set_timeIndex(this._dragTime.get_value() * this._naturalduration);    
    }
    function Ee$UI$Xaml$Media$Player$_onVolumeDown() {
        this.set_volume(Math.max(0, this.get_volume() - 0.02));
    }
    function Ee$UI$Xaml$Media$Player$_onVolumeSliderChanged() {
        this.set_volume(this._dragVolume.get_value());
    }
    function Ee$UI$Xaml$Media$Player$_onVolumeUp() {
        this.set_volume(Math.min(1, this.get_volume() + 0.02));
    }

    function Ee$UI$Xaml$Media$Player$_mediaAvailable(available) {
        // when media is not available (e.g. it is closed or none was opened from the start), disable player controls
        if (this._mediaOpened !== available) {
            this._mediaOpened = available;
            this._playPauseButton.set_enabled(available);
            this._playButton.set_enabled(available);
            this._pauseButton.set_enabled(available);
            this._stopButton.set_enabled(available);
            if (!available) {
                this.set_caption("");
            }
        }
    }

    function Ee$UI$Xaml$Media$Player$_meBufferingProgress() {
        var progress = this._mediaElement.bufferingProgress;
        var percent = Math.round(progress * 100);
        if (percent >= 100) {
            this._enableBuffering(false);
        }
        else {
            this._enableBuffering(true, percent);
        }
    }

    function Ee$UI$Xaml$Media$Player$_meDownloadProgress() {
        // progressive download occuring, means there is no buffering. They don't occur at the same time.
        this._enableBuffering(false);
        this._downloadProgress.set_value(this._mediaElement.downloadProgress);
    }

    function Ee$UI$Xaml$Media$Player$_meMarkerReached(sender, args) {
        this._raiseMarkerReached(new Ee.UI.Xaml.Media.MarkerEventArgs(args.marker));
    }

    function Ee$UI$Xaml$Media$Player$_meMediaEnded() {
        this._mediaEnded = true;
        this._raiseEvent("mediaEnded", Sys.EventArgs.Empty);
    }

    function Ee$UI$Xaml$Media$Player$_meMediaFailed() {   
        this._naturalduration = null;
        this._enableBuffering(false);
        this._mediaAvailable(false);
        this._ensureDuration(false);
        this._ensureSeeking(false);
        this._mediaEnded = false;
        // existing captions should be cleared if the media fails to open
        this.set_caption("");
        
        var handler = this.get_events().getHandler('mediaFailed');
        if (handler) {
            handler(this, Sys.EventArgs.Empty);
        }
        else {
            throw this._getMediaFailedError();
        }   
    }

    function Ee$UI$Xaml$Media$Player$_meMediaOpened() {
        // note: this event may occur multiple times with a single mediaurl, if its an ASX stream with multiple entries.
        
        this._mediaEnded = false;
        // make sure properties set before hand are now copied in (e.g. Volume cant be set until media is loaded)
        this._clearMediaCache();
        // if a placeholder is showing, remove it
        if (this._placeholderImageShowing) {
            this._imageElement.setVisible(false);
            this._placeholderImageShowing = false;
        }
        // existing captions should be cleared if a new media file is opened
        this.set_caption("");
        
        // load markers in the head of the media
        this._markers = [];
        var markers = this._mediaElement.Markers;
        for (var i = 0, l = markers.Count; i < l; i++) {
            Array.add(this._markers, markers.getItem(i));
        }

        this._naturalduration = this._mediaElement.naturalduration.seconds;
        var hasDuration = !!this._naturalduration;
        var canSeek = hasDuration && this._mediaElement.CanSeek;
        if (canSeek) {
            // if seeking is supported, initialize chapter detection
            this._currentChapter = this._getChapterAt(0, true);
            this._lastChapterStarted = -1;
            this._detectChapterChanged();
	    }
	    if (hasDuration) {
            // and set the total/current time labels
            this._totalTimeText.set_text(this._formatTime(this._naturalduration * 1000));
            this._currentTimeText.set_text(this._formatTime(this.get_timeIndex() * 1000));
	    }
	    //this._currentTimeText.set_text(this._formatTime(Math.floor(Math.random()*50) * 1000));
	    // make sure player controls are in the right state
	    this._mediaAvailable(true);
	    this._ensureDuration(hasDuration);
	    this._ensureSeeking(canSeek);

        // hookup timer for monitoring time index (for chapter detection, time slider and currenttimetext updates)
        if (!this._timerCookie) {
            this._tickTimerDelegate = Function.createDelegate(this, this._tickTimer);
            this._timerCookie = window.setTimeout(this._tickTimerDelegate, 100);
        }
        this._raiseEvent("mediaOpened", Sys.EventArgs.Empty);
    }

    function Ee$UI$Xaml$Media$Player$_meStateChanged() {
        var newState = this.get_playState();
        if (newState === "Closed") {
            this._enableBuffering(false);
            this._mediaAvailable(false);
            this._ensureSeeking(false);
            this._mediaEnded = false;
        }
        else if (newState === "Playing" || newState === "Paused") { //newState === "Stopped"
            // playing/paused, make sure buffering area is hidden
            this._enableBuffering(false);
        } else if (newState === "Stopped") {  //&& this._mediaElement.canPause == false
            this._mediaEnded = true;
            this.stop();
            //this._raiseEvent("mediaEnded", Sys.EventArgs.Empty);
        }
        
        var oldState = this._oldState || "";
        if (newState !== oldState) {
            this._oldState = newState;
            this._raisePlayStateChanged(new Ee.UI.Xaml.Media.StateChangedEventArgs("playState", oldState, newState));
        }
    }

    function Ee$UI$Xaml$Media$Player$_raiseChapterStarted(chapterEventArgs) {
        this.onChapterStarted(chapterEventArgs);
        this._raiseEvent("chapterStarted", chapterEventArgs);
        this.raisePropertyChanged("currentChapter");
    }

    function Ee$UI$Xaml$Media$Player$_raiseEvent(name, args) {
        var handler = this.get_events().getHandler(name);
        if (handler) {
            handler(this, args);
        }
    }

    function Ee$UI$Xaml$Media$Player$_raiseMarkerReached(args) {
        if (this._toggledCaptions && this.get_enableCaptions()) {
            var marker = args.get_marker();
            var type = marker.type ? marker.type.toLowerCase() : "";
            if (type === "caption") {
                if (!this._enabledCaptionToggleButton) {
                    this._enabledCaptionToggleButton = true;
                    this._captionButton.setVisible(true);
                }
                var text = marker.text ? marker.text : "";
                if (text.trim().length === 0) {
                    text = "";
                }
                this.set_caption(text);
                this.raisePropertyChanged("caption");
            }
        }

        this.onMarkerReached(args);
        this._raiseEvent("markerReached", args);
    }

    function Ee$UI$Xaml$Media$Player$_raisePlayStateChanged(args) {
        if (this._mediaElement.canPause) {
            this._playPauseButton.set_state(args.get_currentState() === "Playing" ? 1/*pause*/ : 0/*play*/);
        } else {
            this._playPauseButton.set_state(args.get_currentState() === "Playing" ? 2/*stopped*/ : 0/*play*/);
        }
              
        this.onPlayStateChanged(args);
        this._raiseEvent("stateChanged", args);
        this._raiseEvent("propertyChanged", args);
    }

    function Ee$UI$Xaml$Media$Player$_raiseVolumeChanged(args) {
        this.onVolumeChanged(args);
        this._raiseEvent("volumeChanged", args);
        this.raisePropertyChanged("volume");
    }

    function Ee$UI$Xaml$Media$Player$_skipTime(direction) {
        // skipping always skips by 10% of the total duration
        var delta = this._naturalduration / 10;
        // always skip by at least 5 seconds
        delta = direction * Math.max(5, delta);
        var newTime = delta + this.get_timeIndex();
        this.set_timeIndex(newTime);
    }

    function Ee$UI$Xaml$Media$Player$_tickTimer() {
        this._timerCookie = window.setTimeout(this._tickTimerDelegate, 100);
        var time = this.get_timeIndex();
        if (this._hasDuration) {
            if (!this._dragTime._isDragging) {
                this._dragTime.set_value(time / this._naturalduration);
            }
            //this._updateTime(time);
        }
        
        this._updateTime(time); //TIMER
        
        if (this._canSeek) {
            this._detectChapterChanged(time);
        }
    }

    function Ee$UI$Xaml$Media$Player$_updateTime(time) {
        this._currentTimeText.set_text(this._formatTime(time * 1000));
    }
Ee.UI.Xaml.Media.Player.prototype = {
    _mediaEnded: false,
    _naturalduration: null,
    _domElements: null,
    _timerCookie: null,
    _mediaOpened: true,
    _enabledCaptionToggleButton: false,
    _autoPlay: null,
    _canSeek: true,
    _hasDuration: true,
    _caption: null,
    _chapters: null,
    _currentChapter: -1,
    _lastChapterStarted: -1,
    _nextChapterTime: -1,
    _currentChapterTime: -1,
    _enableCaptions: true,
    _toggledCaptions: true,
    _mediaMarkers: null,
    _mediaUrl: null,
    _muted: null,
    _placeholderImage: null,
    _imageElement: null,
    _volume: null,
    _chaptersActive: false,
    _bufferingProgressVisible: false,
    // controls
    _bufferingProgress: null,
    _bufferingStoryboard: null,
    _bufferingText: null,
    _captionButton: null,
    _captionArea: null,
    _captionAreaFS: null,
    _chapterArea: null,
    _currentTimeText: null,
    _downloadProgress: null,
    _dragTime: null,
    _dragVolume: null,
    _mediaElement: null,
    _muteButton: null,
    _nextButton: null,
    _playPauseButton: null,
    _playButton: null,
    _pauseButton: null,
    _stopButton: null,
    _previousButton: null,
    _totalTimeText: null,
    
    add_chapterStarted: Ee$UI$Xaml$Media$Player$add_chapterStarted,
    remove_chapterStarted: Ee$UI$Xaml$Media$Player$remove_chapterStarted,

    add_markerReached: Ee$UI$Xaml$Media$Player$add_markerReached,
    remove_markerReached: Ee$UI$Xaml$Media$Player$remove_markerReached,

    add_mediaEnded: Ee$UI$Xaml$Media$Player$add_mediaEnded,
    remove_mediaEnded: Ee$UI$Xaml$Media$Player$remove_mediaEnded,

    add_mediaFailed: Ee$UI$Xaml$Media$Player$add_mediaFailed,
    remove_mediaFailed: Ee$UI$Xaml$Media$Player$remove_mediaFailed,

    add_mediaOpened: Ee$UI$Xaml$Media$Player$add_mediaOpened,
    remove_mediaOpened: Ee$UI$Xaml$Media$Player$remove_mediaOpened,

    add_stateChanged: Ee$UI$Xaml$Media$Player$add_stateChanged,
    remove_stateChanged: Ee$UI$Xaml$Media$Player$remove_stateChanged,

    add_volumeChanged: Ee$UI$Xaml$Media$Player$add_volumeChanged,
    remove_volumeChanged: Ee$UI$Xaml$Media$Player$remove_volumeChanged,

    get_autoPlay: Ee$UI$Xaml$Media$Player$get_autoPlay,
    set_autoPlay: Ee$UI$Xaml$Media$Player$set_autoPlay,

    get_caption: Ee$UI$Xaml$Media$Player$get_caption,
    set_caption: Ee$UI$Xaml$Media$Player$set_caption,

    get_chapters: Ee$UI$Xaml$Media$Player$get_chapters,
    set_chapters: Ee$UI$Xaml$Media$Player$set_chapters,

    get_currentChapter: Ee$UI$Xaml$Media$Player$get_currentChapter,
    set_currentChapter: Ee$UI$Xaml$Media$Player$set_currentChapter,

    get_enableCaptions: Ee$UI$Xaml$Media$Player$get_enableCaptions,
    set_enableCaptions: Ee$UI$Xaml$Media$Player$set_enableCaptions,
    
    get_mediaMarkers: Ee$UI$Xaml$Media$Player$get_mediaMarkers,
    
    get_mediaElement: Ee$UI$Xaml$Media$Player$get_mediaElement,

    get_mediaUrl: Ee$UI$Xaml$Media$Player$get_mediaUrl,
    set_mediaUrl: Ee$UI$Xaml$Media$Player$set_mediaUrl,

    get_muted: Ee$UI$Xaml$Media$Player$get_muted,
    set_muted: Ee$UI$Xaml$Media$Player$set_muted,

    get_placeholderImage: Ee$UI$Xaml$Media$Player$get_placeholderImage,
    set_placeholderImage: Ee$UI$Xaml$Media$Player$set_placeholderImage,

    get_playState: Ee$UI$Xaml$Media$Player$get_playState,

    get_timeIndex: Ee$UI$Xaml$Media$Player$get_timeIndex,
    set_timeIndex: Ee$UI$Xaml$Media$Player$set_timeIndex,
    
    get_volume: Ee$UI$Xaml$Media$Player$get_volume,
    set_volume: Ee$UI$Xaml$Media$Player$set_volume,

    nextChapter: Ee$UI$Xaml$Media$Player$nextChapter,

    onChapterStarted: Ee$UI$Xaml$Media$Player$onChapterStarted,

    onMarkerReached: Ee$UI$Xaml$Media$Player$onMarkerReached,

    onPlayStateChanged: Ee$UI$Xaml$Media$Player$onPlayStateChanged,

    onVolumeChanged: Ee$UI$Xaml$Media$Player$onVolumeChanged,

    pause: Ee$UI$Xaml$Media$Player$pause,

    play: Ee$UI$Xaml$Media$Player$play,

    previousChapter: Ee$UI$Xaml$Media$Player$previousChapter,
    
    stop: Ee$UI$Xaml$Media$Player$stop,

    toggleMuted: Ee$UI$Xaml$Media$Player$toggleMuted,

    togglePlayPause: Ee$UI$Xaml$Media$Player$togglePlayPause,
    
    xamlDispose: Ee$UI$Xaml$Media$Player$xamlDispose,   

    xamlInitialize: Ee$UI$Xaml$Media$Player$xamlInitialize,

    _bindChildControls: Ee$UI$Xaml$Media$Player$_bindChildControls,
    
    _chapterNext: Ee$UI$Xaml$Media$Player$_chapterNext,
        
    _chapterPrevious: Ee$UI$Xaml$Media$Player$_chapterPrevious,
    
    _clearMediaCache: Ee$UI$Xaml$Media$Player$_clearMediaCache,
    
    _detectChapterChanged: Ee$UI$Xaml$Media$Player$_detectChapterChanged,

    _enableBuffering: Ee$UI$Xaml$Media$Player$_enableBuffering,
    
    _ensureCaption: Ee$UI$Xaml$Media$Player$_ensureCaption,

    _ensureChapterArea: Ee$UI$Xaml$Media$Player$_ensureChapterArea,
    
    _ensureSeeking: Ee$UI$Xaml$Media$Player$_ensureSeeking,
    
    _ensureDuration: Ee$UI$Xaml$Media$Player$_ensureDuration,

    _formatTime: Ee$UI$Xaml$Media$Player$_formatTime,

    _fullScreenChanged: Ee$UI$Xaml$Media$Player$_fullScreenChanged,
    
    _getChapterAt: Ee$UI$Xaml$Media$Player$_getChapterAt,
    
    _getMediaFailedError: Ee$UI$Xaml$Media$Player$_getMediaFailedError,

    _loadChapters: Ee$UI$Xaml$Media$Player$_loadChapters,

    _loadMediaUrl: Ee$UI$Xaml$Media$Player$_loadMediaUrl,    
    
    _loadPlaceholderImage: Ee$UI$Xaml$Media$Player$_loadPlaceholderImage,
    
    _onCaptionToggle: Ee$UI$Xaml$Media$Player$_onCaptionToggle,

    _onFullScreen: Ee$UI$Xaml$Media$Player$_onFullScreen,
    _onFullScreenME: Ee$UI$Xaml$Media$Player$_onFullScreenME,
    _onTimeSliderChanged: Ee$UI$Xaml$Media$Player$_onTimeSliderChanged,
    _onVolumeDown: Ee$UI$Xaml$Media$Player$_onVolumeDown,
    _onVolumeSliderChanged: Ee$UI$Xaml$Media$Player$_onVolumeSliderChanged,
    _onVolumeUp: Ee$UI$Xaml$Media$Player$_onVolumeUp,
    
    _mediaAvailable: Ee$UI$Xaml$Media$Player$_mediaAvailable,

    _meBufferingProgress: Ee$UI$Xaml$Media$Player$_meBufferingProgress,
    
    _meDownloadProgress: Ee$UI$Xaml$Media$Player$_meDownloadProgress,

    _meMarkerReached: Ee$UI$Xaml$Media$Player$_meMarkerReached,
    
    _meMediaEnded: Ee$UI$Xaml$Media$Player$_meMediaEnded,

    _meMediaFailed: Ee$UI$Xaml$Media$Player$_meMediaFailed,

    _meMediaOpened: Ee$UI$Xaml$Media$Player$_meMediaOpened,
    
    _meStateChanged: Ee$UI$Xaml$Media$Player$_meStateChanged,
    
    _raiseChapterStarted: Ee$UI$Xaml$Media$Player$_raiseChapterStarted,
    
    _raiseEvent: Ee$UI$Xaml$Media$Player$_raiseEvent,
    
    _raiseMarkerReached: Ee$UI$Xaml$Media$Player$_raiseMarkerReached,
    
    _raisePlayStateChanged: Ee$UI$Xaml$Media$Player$_raisePlayStateChanged,    
    
    _raiseVolumeChanged: Ee$UI$Xaml$Media$Player$_raiseVolumeChanged,
    
    _skipTime: Ee$UI$Xaml$Media$Player$_skipTime,
    
    _tickTimer: Ee$UI$Xaml$Media$Player$_tickTimer,
    
    _updateTime: Ee$UI$Xaml$Media$Player$_updateTime
}
Ee.UI.Xaml.Media.Player._defaultVolume = 0.5;
Ee.UI.Xaml.Media.Player.registerClass('Ee.UI.Xaml.Media.Player', Ee.UI.Xaml.Control);

Ee.UI.Xaml.Media.StateChangedEventArgs = function Ee$UI$Xaml$Media$StateChangedEventArgs(propertyName, previousState, currentState) {
    /// <param name="propertyName" type="String"></param>
    /// <param name="previousState"></param>
    /// <param name="currentState"></param>
    var e = Function._validateParams(arguments, [
        {name: "propertyName", type: String},
        {name: "previousState"},
        {name: "currentState"}
    ]);
    if (e) throw e;

    this._currentState = currentState;
    this._previousState = previousState;
    Ee.UI.Xaml.Media.StateChangedEventArgs.initializeBase(this, [propertyName]);
}

    function Ee$UI$Xaml$Media$StateChangedEventArgs$get_currentState() {
        /// <value></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._currentState || null;
    }
    function Ee$UI$Xaml$Media$StateChangedEventArgs$get_previousState() {
        /// <value></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._previousState || null;
    }
Ee.UI.Xaml.Media.StateChangedEventArgs.prototype = {
    get_currentState: Ee$UI$Xaml$Media$StateChangedEventArgs$get_currentState,
    get_previousState: Ee$UI$Xaml$Media$StateChangedEventArgs$get_previousState
}
Ee.UI.Xaml.Media.StateChangedEventArgs.registerClass("Ee.UI.Xaml.Media.StateChangedEventArgs", Sys.PropertyChangedEventArgs);
Ee.UI.Xaml.Media.ChapterEventArgs = function Ee$UI$Xaml$Media$ChapterEventArgs(chapterIndex) {
    /// <param name="chapterIndex" type="Number"></param>
    var e = Function._validateParams(arguments, [
        {name: "chapterIndex", type: Number}
    ]);
    if (e) throw e;

    this._chapterIndex = chapterIndex;
    Ee.UI.Xaml.Media.ChapterEventArgs.initializeBase(this);
}

    function Ee$UI$Xaml$Media$ChapterEventArgs$get_chapterIndex() {
        /// <value type="Number"></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._chapterIndex;
    }
Ee.UI.Xaml.Media.ChapterEventArgs.prototype = {
    get_chapterIndex: Ee$UI$Xaml$Media$ChapterEventArgs$get_chapterIndex
}
Ee.UI.Xaml.Media.ChapterEventArgs.registerClass("Ee.UI.Xaml.Media.ChapterEventArgs", Sys.EventArgs);
Ee.UI.Xaml.Media.MarkerEventArgs = function Ee$UI$Xaml$Media$MarkerEventArgs(marker) {
    /// <param name="marker"></param>
    var e = Function._validateParams(arguments, [
        {name: "marker"}
    ]);
    if (e) throw e;

    this._marker = marker;
    Ee.UI.Xaml.Media.MarkerEventArgs.initializeBase(this);
}

    function Ee$UI$Xaml$Media$MarkerEventArgs$get_marker() {
        /// <value></value>
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._marker || null;
    }
Ee.UI.Xaml.Media.MarkerEventArgs.prototype = {
    get_marker: Ee$UI$Xaml$Media$MarkerEventArgs$get_marker
}
Ee.UI.Xaml.Media.MarkerEventArgs.registerClass("Ee.UI.Xaml.Media.MarkerEventArgs", Sys.EventArgs);

Ee.UI.Xaml.Media._TextBlock = function Ee$UI$Xaml$Media$_TextBlock(host, textBlockElementName, backgroundElementName) {
    // <param name="host">Silverlight host</param>
    // <param name="textBlockElementName" type="String">Name of XAML TextBlock</param>
    // <param name="backgroundElementName" type="String" optional="true" mayBeNull="true">Name of XAML element that will serve as a background for the text block, if any</param>
    Ee.UI.Xaml.Media._TextBlock.initializeBase(this, [host, textBlockElementName]);
    var control = this.get_control();
    if (control && backgroundElementName) {
        var bg = control.findName(backgroundElementName);
        if (bg) {
            this._centerX = bg["Canvas.Left"] + bg.width / 2;
            this._bottomY = bg["Canvas.Top"] + bg.height;
            this._background = bg;
        }
    }

    if (control && !this._background && textBlockElementName) {
        var bg = control.findName(textBlockElementName);
        if (bg) {
            this._centerX = bg["Canvas.Left"] + bg.ActualWidth / 2;
            this._bottomY = bg["Canvas.Top"] + bg.ActualHeight;
            this._background = bg;
        }
    }

}





    function Ee$UI$Xaml$Media$_TextBlock$get_backgroundControl() {
        if (arguments.length !== 0) throw Error.parameterCount();
        // <value mayBeNull="true">The Silverlight control that acts as the background for the text block.</value>
        return this._background || null;
    }

    function Ee$UI$Xaml$Media$_TextBlock$get_text() {
        if (arguments.length !== 0) throw Error.parameterCount();
        // <value type="String" mayBeNull="true"></value>
        var control = this.get_control();
        return control ? (control.Text || "") : "";
    }
    function Ee$UI$Xaml$Media$_TextBlock$set_text(value) {
        var control = this.get_control();
        if (control) {
            control.Text = value || "";
            this.setVisible(!!value);
            var bg = this.get_backgroundControl();
            if (bg) {
                var x = control.ActualWidth;
                var y = control.ActualHeight;
                bg["Canvas.Left"] = this._centerX - x / 2;
                bg["Canvas.Top"] = this._bottomY - y;
                bg.width = x;
                bg.height = y;
            }
        }
    }

    function Ee$UI$Xaml$Media$_TextBlock$dispose() {
        Ee.UI.Xaml.Media._TextBlock.callBaseMethod(this, "dispose");
        this._background = null;
    }

    function Ee$UI$Xaml$Media$_TextBlock$setVisible(value) {
        Ee.UI.Xaml.Media._TextBlock.callBaseMethod(this, "setVisible", [value]);
        var c = this.get_backgroundControl();
        if (c) c.visibility = value ? 0 : 1;        
    }
Ee.UI.Xaml.Media._TextBlock.prototype = {
    _centerX: 0,
    _bottomY: 0,
    _background: null,
    
    get_backgroundControl: Ee$UI$Xaml$Media$_TextBlock$get_backgroundControl,
    
    get_text: Ee$UI$Xaml$Media$_TextBlock$get_text,
    set_text: Ee$UI$Xaml$Media$_TextBlock$set_text,

    dispose: Ee$UI$Xaml$Media$_TextBlock$dispose,
    
    setVisible: Ee$UI$Xaml$Media$_TextBlock$setVisible
}
Ee.UI.Xaml.Media._TextBlock.registerClass('Ee.UI.Xaml.Media._TextBlock', Ee.UI.Xaml.Media._DomElement);
Ee.UI.Xaml.Media._MultiStateButton = function Ee$UI$Xaml$Media$_MultiStateButton(host, nameElement, autorepeatInterval, clickHandler, doubleClickHandler, handlerOwner, stateList) {
    Ee.UI.Xaml.Media._MultiStateButton.initializeBase(this, [host, nameElement, autorepeatInterval, clickHandler, doubleClickHandler, handlerOwner]);
    // animations for state changes
    var stateCount = arguments.length-6;
    
    
    this._animationsOn = new Array(stateCount);
    this._animationsOff = new Array(stateCount);
    this._controls = new Array(stateCount);

    var control = this.get_control();
    for (var i = 0; i < stateCount; i++) {
        var nameControl = arguments[i + 6];
        var ctl = control ? control.findName(nameControl) : null;
        
        // check for (control)_Show and (control)_Hide
        this._controls[i] = ctl || null;
        this._animationsOn[i] = ctl ? ctl.findName(nameControl + "_Show") : null;
        this._animationsOff[i] = ctl ? ctl.findName(nameControl + "_Hide") : null;
        //window.status += " : "+nameControl+" i: "+i;
    }
}






    function Ee$UI$Xaml$Media$_MultiStateButton$get_state() {
        if (arguments.length !== 0) throw Error.parameterCount();
        // <value type="Number" integer="true">current button state</value>
        return this._state;
    }
    function Ee$UI$Xaml$Media$_MultiStateButton$set_state(value) {
        
        if (value !== this._state) {
            var a = this._animationsOff[this._state];
            if (a) {
                a.begin();
            }
            else {
                var cOff = this._controls[this._state];
                if (cOff) cOff.visibility = 1;
            }
            this._state = value;
            a = this._animationsOn[this._state];
            if (a) {
                a.begin();
            }
            else {
                var cOn = this._controls[this._state];
                if (cOn) cOn.visibility = 0;
            }
            
            //window.status = "set state: "+value+" _state: "+this._state+" a: "+a;
        }
        
        
    }

    function Ee$UI$Xaml$Media$_MultiStateButton$dispose() {
        Ee.UI.Xaml.Media._MultiStateButton.callBaseMethod(this, "dispose");
        this._animationsOn = null;
        this._animationsOff = null;
        this._controls = null;
        this._state = 0;
    }
Ee.UI.Xaml.Media._MultiStateButton.prototype = {
    _state: 0,
    _animationsOn: null,
    _animationsOff: null,
    _controls: null,
    
    get_state: Ee$UI$Xaml$Media$_MultiStateButton$get_state,
    set_state: Ee$UI$Xaml$Media$_MultiStateButton$set_state,
    
    dispose: Ee$UI$Xaml$Media$_MultiStateButton$dispose
}
Ee.UI.Xaml.Media._MultiStateButton.registerClass('Ee.UI.Xaml.Media._MultiStateButton', Ee.UI.Xaml.Media._Button);

Ee.UI.Xaml.Media._ImageList = function Ee$UI$Xaml$Media$_ImageList(host, imageListName) {
    // Implements the script required to drive a horizontal ImageList.
    // The ImageList is xaml that contains the following structure:
    // TODO: explaination
    Ee.UI.Xaml.Media._ImageList.initializeBase(this, [host, imageListName]);
    var control = this.get_control();
    if (!control) return;
    control.cursor = "Arrow";

    this._scrollAnimationSB = control.findName(imageListName + "_ScrollAnimationStoryboard");
    if (this._scrollAnimationSB) this._scrollAnimation = control.findName(imageListName + "_ScrollAnimation");
    
    var interval = this._scrollAnimation ? (this._scrollAnimation.duration.seconds*1000) : 200;
    interval = Math.max(interval, 200);
    this._scrollNext = new Ee.UI.Xaml.Media._Button(host, imageListName + "_ScrollNext", interval, this._scrollNextClick, null, this);
	this._scrollPrev = new Ee.UI.Xaml.Media._Button(host, imageListName + "_ScrollPrevious", interval, this._scrollPrevClick, null, this);
	
	this._findItems(imageListName);
	this._virtualItems = [];
}











    function Ee$UI$Xaml$Media$_ImageList$get_items() {
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._virtualItems;
    }
    function Ee$UI$Xaml$Media$_ImageList$set_items(value) {
        this._virtualItems = Array.clone(value);
        this._reset();
        this._assignImages();
    }

    function Ee$UI$Xaml$Media$_ImageList$onItemClick(virtualIndex) {
    }

    function Ee$UI$Xaml$Media$_ImageList$_assignImages() {
        for (var i = 0, l = this._items.length; i < l; i++) {
            var item = this._items[i];
            var offset = this._itemOffset + i;
            if (offset < this._virtualItems.length) {
                item.image.Source = this._virtualItems[offset];
                item.button.get_control().visibility = 0; // visible
                item.button._virtualIndex = offset;
            }
            else {
                item.button.get_control().visibility = 1; // collapsed
            }
        }
    }

    function Ee$UI$Xaml$Media$_ImageList$_findItems(baseName) {
        var control = this.get_control();
        var i = 1;
        this._items = [];
        var itemName = baseName + "_ScrollItem1",
            imageName = baseName + "_ScrollItem1_Image",
            item = control.findName(itemName),
            image = control.findName(imageName);

        while(item) {
            var btn = new Ee.UI.Xaml.Media._Button(
                        control.getHost(), itemName, null,
                        this._itemClick, null, this, /*requiresSender*/true);
            btn._physicalIndex = i-1;
            this._items[this._items.length] = { button: btn, image: image };
            i++;
            itemName = baseName + "_ScrollItem" + i;
            imageName = baseName + "_ScrollItem" + i + "_Image";
            item = control.findName(itemName);
            image = control.findName(imageName);
        }

        if (this._items.length === 0) {
            throw Error.invalidOperation("ImageList needs at least one scroll item.");
        }

        var firstItem = this._items[0].button.get_control();
        this._itemSize = firstItem.width;
        //this._itemSpacing = (firstItem["Canvas.Left"] - firstItem.getParent()["Canvas.Left"]) * 2;
        this._itemSpacing = firstItem["Canvas.Left"] * 2;
    }

    function Ee$UI$Xaml$Media$_ImageList$_handleOverflow(direction) {
        // ensures the overflow item is in the right position
        
        // determine virtual index of the overflow item
        var layoutIndex = direction === 1 ? (this._items.length-1) : -1;
        var virtualIndex = this._itemOffset + layoutIndex;
        
        // assign virtual item data to the overflow item
        var overflowItem = this._items[this._overflowIndex];
        overflowItem.image.Source = this._virtualItems[virtualIndex];
        overflowItem.button._virtualIndex = virtualIndex;
        
        // position the overflow item
        var button = overflowItem.button.get_control();
        button["Canvas.Left"] = virtualIndex * (this._itemSize + this._itemSpacing) + (this._itemSpacing / 2);
        
        // overflow item is no longer an overflow item, advance the index
        this._overflowIndex += direction;
        if (this._overflowIndex < 0) {
            this._overflowIndex = this._items.length - 1;
        }
        else if (this._overflowIndex >= this._items.length) {
            this._overflowIndex = 0;
        }
    }

    function Ee$UI$Xaml$Media$_ImageList$_itemClick(sender) {
        // sender given because Button was instantiated with requiresSender=true
        this.onItemClick(sender._virtualIndex);
    }

    function Ee$UI$Xaml$Media$_ImageList$_reset() {
	    this._itemOffset = 0;
	    for (var i = 0, l = this._items.length; i < l; i++) {
	        var button = this._items[i].button;
	        button._virtualIndex = i;
    	    button.get_control()["Canvas.Left"] = i * (this._itemSize + this._itemSpacing) + (this._itemSpacing/2);
	    }
	    this._overflowIndex = this._items.length - 1;
	    // ensure scrolled to the beginning
        if (this._scrollAnimation) {
            this._scrollAnimation.To = "0";
            this._scrollAnimationSB.begin();
        }
    }

    function Ee$UI$Xaml$Media$_ImageList$_scroll(direction) {
        if (this._scrollAnimation) {
            this._handleOverflow(direction);

            var fromOffset = this._itemOffset;
            this._itemOffset += direction;

            this._scrollAnimation.From = "-" + (fromOffset * (this._itemSize + this._itemSpacing));
            this._scrollAnimation.To = "-" + (this._itemOffset * (this._itemSize + this._itemSpacing));
            this._scrollAnimationSB.begin();
        }
        else {
            this._itemOffset += direction;
            this._assignImages();            
        }
    }

    function Ee$UI$Xaml$Media$_ImageList$_scrollNextClick() {
        if (this._itemOffset < (this._virtualItems.length - this._items.length + 1)) {
            this._scroll(1);
        }
    }

    function Ee$UI$Xaml$Media$_ImageList$_scrollPrevClick() {
        if (this._itemOffset > 0) {
            this._scroll(-1);
        }
    }

    function Ee$UI$Xaml$Media$_ImageList$dispose() {
        if (this._scrollNext) this._scrollNext.dispose();
        if (this._scrollPrev) this._scrollPrev.dispose();
        this._scrollNext = null;
        this._scrollPrev = null;

        if (this._items) {
            for (var i = 0, l = this._items.length; i < l; i++) {
                var button = this._items[i].button;
                button.dispose();
            }
            this._items = null;
        }     
        this._virtualItems = null;
        this._itemSize = null;
        this._itemSpacing = null;
        this._scrollAnimation = null;
        this._scrollAnimationSB = null;
        Ee.UI.Xaml.Media._ImageList.callBaseMethod(this, "dispose");
    }
Ee.UI.Xaml.Media._ImageList.prototype = {
    _items: null,
    _virtualItems: null,
    _scrollNext: null,
    _scrollPrev: null,
    _scrollAnimation: null,
    _scrollAnimationSB: null,
    _itemSize: 0,
    _itemSpacing: 0,
    _overflowIndex: 0,
    
    get_items: Ee$UI$Xaml$Media$_ImageList$get_items,
    set_items: Ee$UI$Xaml$Media$_ImageList$set_items,
    
    onItemClick: Ee$UI$Xaml$Media$_ImageList$onItemClick,    
    
    _assignImages: Ee$UI$Xaml$Media$_ImageList$_assignImages,
    
    _findItems: Ee$UI$Xaml$Media$_ImageList$_findItems,
    
    _handleOverflow: Ee$UI$Xaml$Media$_ImageList$_handleOverflow,
    
    _itemClick: Ee$UI$Xaml$Media$_ImageList$_itemClick,
    
    _reset: Ee$UI$Xaml$Media$_ImageList$_reset,
    
    _scroll: Ee$UI$Xaml$Media$_ImageList$_scroll,
    
    _scrollNextClick: Ee$UI$Xaml$Media$_ImageList$_scrollNextClick,
    
    _scrollPrevClick: Ee$UI$Xaml$Media$_ImageList$_scrollPrevClick,

    dispose: Ee$UI$Xaml$Media$_ImageList$dispose
}
Ee.UI.Xaml.Media._ImageList.registerClass('Ee.UI.Xaml.Media._ImageList', Ee.UI.Xaml.Media._DomElement);
Ee.UI.Xaml.Media._ChapterArea = function Ee$UI$Xaml$Media$_ChapterArea(player) {
    this._player = player;
    var names = Ee.UI.Xaml.Media.PlayerElementName;
    Ee.UI.Xaml.Media._ChapterArea.initializeBase(this, [player.get_element(), names.chapterArea]);
    var control = this.get_control();
    if (control) {
        this._toggleButton = new Ee.UI.Xaml.Media._Button(player.get_element(), names.chapterToggleButton, null, this._onToggle, null, this);
    }
}





    function Ee$UI$Xaml$Media$_ChapterArea$activate() {
        // activate means there are chapters to be shown, so the chapter area should be 'activated', but not necessarily visible.
        // for example, a chapter area that is only visible when the mouse is over it. It should be active in that it shows when you
        // hover over it, but not always visible. We use visibility to activate/deactivate, the skin defines its own _Hide and _Show
        // animation which we control via the toggle button (or they could define a MouseEnter MouseLeave for simply reveal opacity).
        // If there are no chapters for the media, the chapter area is deactivated (e.g. so no hover occurs) and the toggle button is
        // hidden (if it exists).
        var c = this.get_control();
        if (!c) return;
        c.visibility = 0;
        this._toggleButton.setVisible(true);
    }

    function Ee$UI$Xaml$Media$_ChapterArea$deactivate() {
        var c = this.get_control();
        if (!c) return;
        c.visibility = 1;
        this._toggleButton.setVisible(false);
    }

    function Ee$UI$Xaml$Media$_ChapterArea$dispose() {
        Ee.UI.Xaml.Media._ChapterArea.callBaseMethod(this, "dispose");
        this._player = null;
        if (this._toggleButton) this._toggleButton.dispose();
        this._toggleButton = null;
    }

    function Ee$UI$Xaml$Media$_ChapterArea$onItemClick(index) {
        this._player.set_currentChapter(this._imageChapters[index]);
    }

    function Ee$UI$Xaml$Media$_ChapterArea$setChapters(chapters) {
        // <param name="chapters" type="Array" mayBeNull="true" elementMayBeNull="true">Array of chapters.</param>
        if (!this.get_control()) return;
        var imageArray = [];
        // only care about chapters that have images with them
        if (chapters) {
            this._imageChapters = [];
            for (var i = 0, l = chapters.length; i < l; i++) {
                var chapter = chapters[i];
                if (chapter.imageUrl) {
                    this._imageChapters[this._imageChapters.length] = i;
                    imageArray[imageArray.length] = chapter.imageUrl;
                }
            }
        }
        this.set_items(imageArray);
    }

    function Ee$UI$Xaml$Media$_ChapterArea$_onToggle() {
        this._visible = !this._visible;
        this.setVisible(this._visible);
        var c = this.get_control();
        // make sure the chapter area isn't hit testable when its supposed to be hidden
        if (c) c.IsHitTestVisible = this._visible;
    }
Ee.UI.Xaml.Media._ChapterArea.prototype = {
    _player: null,
    _visible: false,
    _toggleButton: null,
    
    activate: Ee$UI$Xaml$Media$_ChapterArea$activate,
    
    deactivate: Ee$UI$Xaml$Media$_ChapterArea$deactivate,
    
    dispose: Ee$UI$Xaml$Media$_ChapterArea$dispose,

    onItemClick: Ee$UI$Xaml$Media$_ChapterArea$onItemClick,
    
    setChapters: Ee$UI$Xaml$Media$_ChapterArea$setChapters,
    
    _onToggle: Ee$UI$Xaml$Media$_ChapterArea$_onToggle
}
Ee.UI.Xaml.Media._ChapterArea.registerClass('Ee.UI.Xaml.Media._ChapterArea', Ee.UI.Xaml.Media._ImageList);

Ee.UI.Xaml.Media._Slider = function Ee$UI$Xaml$Media$_Slider(host, nameThumb, nameSlider, valueChangedHandler, handlerOwner) {
    // assumption: the thumb and slider canvases are siblings.
    Ee.UI.Xaml.Media._Slider.initializeBase(this, [host, nameSlider]);
    
    this._slider = this.get_control();
    this._thumb = new Ee.UI.Xaml.Media._DomElement(host, nameThumb);
    this._thumbControl = this._thumb.get_control();

    if (!this._thumbControl || !this._slider) {
        return;
    }
    this._highlight = new Ee.UI.Xaml.Media._DomElement(host, nameSlider + "_Highlight");
    this._highlightControl = this._highlight.get_control();
    
    this._slider.cursor = "Hand";
    this._thumbControl.cursor = "Hand";

    this._thumb.bindEvent("mouseLeftButtonDown", null, this._thumbMouseLeftButtonDown, this);
    this._thumb.bindEvent("mouseLeftButtonUp", null, this._thumbMouseLeftButtonUp, this);
    this._thumb.bindEvent("mouseMove", null, this._thumbMouseMove, this);
    this.bindEvent("mouseLeftButtonDown", null, this._sliderLeftButtonDown, this);
    
    // get to the root canvas and listen to its mouseLeave, so that we can ensure we know when
    // we loose mouse capture when the mouse leaves the silverlight host
    this._rootToken = this._slider.getHost().content.root.addEventListener("mouseLeave", Function.createDelegate(this, this._cancelDragging));

    this._isHorizontal = (this._slider.width >= this._slider.height);

    if (this._highlightControl) {
        this._highlightControl[this._isHorizontal ? "width" : "height"] = 0;
    }

    if (handlerOwner) {
        this._changedHandler = Function.createDelegate(handlerOwner, valueChangedHandler);
    }
}











    function Ee$UI$Xaml$Media$_Slider$set_enabled(value) {
        if (this.get_enabled() !== value) {
            Ee.UI.Xaml.Media._Slider.callBaseMethod(this, "set_enabled", [value]);
            // highlight bar should not respond when time is not shown
            this._highlight.set_enabled(value);
            // thumb should fade away when time disabled
            this._thumb.setVisible(value);
            // thumb should not have hand cursor when disabled
            if (this._thumbControl) this._thumbControl.cursor = value ? "Hand" : "Default";
            // slider's position should be 0 when disabled
            if (!value) this.set_value(0);
            // slider should not have hand cursor when disabled
            if (this._slider) this._slider.cursor = value ? "Hand" : "Default";
        }        
    }

    function Ee$UI$Xaml$Media$_Slider$get_enableSeeking() {
        if (arguments.length !== 0) throw Error.parameterCount();
        return !!this._enableSeeking;
    }
    function Ee$UI$Xaml$Media$_Slider$set_enableSeeking(value) {
        if (this._enableSeeking !== value) {
            this._enableSeeking = value;
            if (!value) this._cancelDragging();
        }
    }

    function Ee$UI$Xaml$Media$_Slider$get_value() {
        if (arguments.length !== 0) throw Error.parameterCount();
        // <value type="Number">A number between 0 and 1 representing the current position of the slider's thumb.</value>
        if (!this._thumbControl || !this._slider) return 0;

        var val;
        if (this._isHorizontal) {
            //val = this._thumbControl["Canvas.Left"] - this._slider["Canvas.Left"] + (this._thumbControl.width/2);
            val = this._thumbControl["Canvas.Left"] - this._slider["Canvas.Left"];
            val = val / (this._slider.width - this._thumbControl.width);
        }
        else {
            val = this._thumbControl["Canvas.Top"] - this._slider["Canvas.Top"] + (this._thumbControl.height/2);
            val = 1 - (val / this._slider.height);
        }
        // make value accurate to 0.001
        val = Math.round(val*1000)/1000;
        return Math.min(1, Math.max(0, val));
    }
    function Ee$UI$Xaml$Media$_Slider$set_value(value) {
        value = Math.min(1, Math.max(0, value));
        this._setThumbPosition(value);
    }

    function Ee$UI$Xaml$Media$_Slider$dispose() {
        if (this._highlight) this._highlight.dispose();
        if (this._thumb) this._thumb.dispose();
        this._changedHandler = null;
        if (this._rootToken) this._slider.getHost().content.root.removeEventListener("mouseLeave", this._rootToken);
        this._slider = null;
        this._thumb = null;
        this._thumbControl = null;
        this._rootToken = null;
        this._highlight = null;
        this._highlightControl = null;
        Ee.UI.Xaml.Media._Slider.callBaseMethod(this, 'dispose');                
    }

    function Ee$UI$Xaml$Media$_Slider$_cancelDragging() {
        if (this._isDragging) {
            this._isDragging = false;
            this._thumbControl.ReleaseMouseCapture();
        }
    }

    function Ee$UI$Xaml$Media$_Slider$_setThumbPosition(value) {
        if (this._thumbControl && this._slider) {
            var loc = this._toLocation(value);
            if (this._isHorizontal) {
                this._thumbControl["Canvas.Left"] = this._slider["Canvas.Left"] + loc - (this._thumbControl.width/2);
                if (this._highlightControl) this._highlightControl.width = loc + (this._thumbControl.width/2);
            }
            else {
                this._thumbControl["Canvas.Top"] = this._slider["Canvas.Top"] + loc - (this._thumbControl.height/2);
                if (this._highlightControl) {
                    this._highlightControl["Canvas.Top"] = this._thumbControl["Canvas.Top"] + (this._thumbControl.height/2);
                    this._highlightControl.height = value * (this._slider.height - this._thumbControl.height) - (this._thumbControl.height/2);
                }
            }
        }
    }

    function Ee$UI$Xaml$Media$_Slider$_sliderLeftButtonDown(sender, eventArgs) {
        if (!this._enableSeeking) return false;
        var newValue = this._toValue(eventArgs.getPosition(sender));
        this._setThumbPosition(newValue);
        if (this._changedHandler) this._changedHandler();
        if (this._thumbControl) {
            this._isDragging = true;
            this._thumbControl.CaptureMouse();
        }
        return true;
    }

    function Ee$UI$Xaml$Media$_Slider$_thumbMouseLeftButtonDown() {
        if (!this._enableSeeking) return false;
        this._isDragging = true;
        this._thumbControl.CaptureMouse();
        return true;
    }

    function Ee$UI$Xaml$Media$_Slider$_thumbMouseLeftButtonUp() {
        if (!this._enableSeeking) return false;
        this._isDragging = false;
        this._thumbControl.ReleaseMouseCapture();
        return true;
    }

    function Ee$UI$Xaml$Media$_Slider$_thumbMouseMove(sender, args) {
        if (this._isDragging) {
            this._setThumbPosition(this._toValue(args.getPosition(this._slider)));
            if (this._changedHandler) this._changedHandler();
        }
        return true;
    }

    function Ee$UI$Xaml$Media$_Slider$_toValue(point) {
        // converts a point which is relative to the Slider control's position to a logical slider value
        var val;
        if (this._isHorizontal) {
            val = (point.X - (this._thumbControl.width / 2)) / (this._slider.width - this._thumbControl.width);
        }
        else {
            val = (point.Y - (this._thumbControl.height / 2)) / (this._slider.height - this._thumbControl.height);
            val = 1 - val;
        }
        return Math.min(1, Math.max(0, val));
    }

    function Ee$UI$Xaml$Media$_Slider$_toLocation(value) {
        // converts a logical value into a point which is relative to the Slider control's position
        value = Math.min(1, Math.max(0, value));
        if (this._isHorizontal) {
            return (value * (this._slider.width - this._thumbControl.width)) + (this._thumbControl.width / 2);
        }
        else {
            var range = this._slider.height - this._thumbControl.height;
            return (range - (value * range)) + (this._thumbControl.height / 2);
        }
    }
Ee.UI.Xaml.Media._Slider.prototype = {
    _slider: null,
    _thumb: null,
    _thumbControl: null,
    _enableSeeking: true,
    _highlight: null,
    _highlightControl: null,
    _isDragging: false,
    _isHorizontal: true,
    _rootToken: null,

    set_enabled: Ee$UI$Xaml$Media$_Slider$set_enabled,
    
    get_enableSeeking: Ee$UI$Xaml$Media$_Slider$get_enableSeeking,
    set_enableSeeking: Ee$UI$Xaml$Media$_Slider$set_enableSeeking,

    get_value: Ee$UI$Xaml$Media$_Slider$get_value,
    set_value: Ee$UI$Xaml$Media$_Slider$set_value,
    
    dispose: Ee$UI$Xaml$Media$_Slider$dispose,    
    
    _cancelDragging: Ee$UI$Xaml$Media$_Slider$_cancelDragging,
    
    _setThumbPosition: Ee$UI$Xaml$Media$_Slider$_setThumbPosition,
    
    _sliderLeftButtonDown: Ee$UI$Xaml$Media$_Slider$_sliderLeftButtonDown,
    
    _thumbMouseLeftButtonDown: Ee$UI$Xaml$Media$_Slider$_thumbMouseLeftButtonDown,

    _thumbMouseLeftButtonUp: Ee$UI$Xaml$Media$_Slider$_thumbMouseLeftButtonUp,

    _thumbMouseMove: Ee$UI$Xaml$Media$_Slider$_thumbMouseMove,
    
    _toValue: Ee$UI$Xaml$Media$_Slider$_toValue,
    
    _toLocation: Ee$UI$Xaml$Media$_Slider$_toLocation    
}
Ee.UI.Xaml.Media._Slider.registerClass('Ee.UI.Xaml.Media._Slider', Ee.UI.Xaml.Media._DomElement);
Ee.UI.Xaml.Media._ProgressBar = function Ee$UI$Xaml$Media$_ProgressBar(host, nameSlider, nameText) {
    // <summary>An element whose width depends on the value.</summary>
    // <param name="host">The Silverlight host.</param>
    // <param name="nameSlider" type="String">name of XAML canvas that represents the slider, where the existing width is the 100% point</param>
    // <param name="nameText" type="String">Optional name of XAML TextBlock where the actual percentage amount should be displayed</param>
    Ee.UI.Xaml.Media._ProgressBar.initializeBase(this, [host, nameSlider]);
    
    var control = this.get_control();
    if (control) {
        this._originalWidth = control.width;
        control.width = 0;
    }
    if (nameText) {
        this._xamlText = new Ee.UI.Xaml.Media._TextBlock(host, nameText);
        this._xamlText.set_text("");
    }
}




    function Ee$UI$Xaml$Media$_ProgressBar$get_value() {
        if (arguments.length !== 0) throw Error.parameterCount();
        // <value type="Number">Progress value between 0 and 1.</value>
        var c = this.get_control();
        if (!c) return 0;
        return c.width / this._originalWidth;
    }
    function Ee$UI$Xaml$Media$_ProgressBar$set_value(value) {
        var c = this.get_control();
        if (c) c.width = this._originalWidth * value;
        this._xamlText.set_text("" + Math.floor(value * 100));
    }

    function Ee$UI$Xaml$Media$_ProgressBar$setVisible(value) {
        Ee.UI.Xaml.Media._ProgressBar.callBaseMethod(this, "setVisible", [value]);
        if (this._xamlText) this._xamlText.setVisible(value);
    }

    function Ee$UI$Xaml$Media$_ProgressBar$dispose() {
        Ee.UI.Xaml.Media._ProgressBar.callBaseMethod(this, "dispose");
        if (this._xamlText) {
            this._xamlText.dispose();
            this._xamlText = null;
        }
    }
Ee.UI.Xaml.Media._ProgressBar.prototype = {
    _xamlText: null,
    _originalWidth: 0,
    
    get_value: Ee$UI$Xaml$Media$_ProgressBar$get_value,
    set_value: Ee$UI$Xaml$Media$_ProgressBar$set_value,
    
    setVisible: Ee$UI$Xaml$Media$_ProgressBar$setVisible,
   
    dispose: Ee$UI$Xaml$Media$_ProgressBar$dispose
}
Ee.UI.Xaml.Media._ProgressBar.registerClass('Ee.UI.Xaml.Media._ProgressBar', Ee.UI.Xaml.Media._DomElement);


// EePlayer extends the BasePlayer player class, adding URL parsing and mediainfo support
//

Type.registerNamespace('EePlayer');

//
// optional URL parameters
//
EePlayer.UrlParam = {
    startTime   :   "startTime",    // specify start time for presentation on url in seconds as ...&start=5&...
    chapter     :   "chapter",      // start presentation at chapter # passed on url...&chapter=2&...
    loopCount   :   "loopCount",    // specify # of times to loop presentation on url as ...&loop=5&...  (-1 means forever)
    mediaUrl    :   "mediaUrl",     // overrides the video source passed into the script, plays this video instead
    volume      :   "volume",       // overrides starting volume
    muted       :   "muted",        // mute=true mutes volume at start
    duration    :   "duration",     // amount of time to play
    autoplay    :   "autoplay",    // auto start playing presentation (default = 1 - yes)
    mediainfo   :   "mediainfo"     // media info, URL to JScript file with function 'mediainfo' which returns a JSON array (see docs)
};


EePlayer.Player = function EePlayer$Player(domElement) {
    EePlayer.Player.initializeBase(this, [domElement]);
    this._fInitialized=false;
}

    function EePlayer$Player$initialize() {
        EePlayer.Player.callBaseMethod(this, 'initialize');

        // listen to URL parameters
        this.set_autoPlay( $getArgument(EePlayer.UrlParam.autoplay, this.get_autoPlay().toString()) === "true" );
        this.set_mediaUrl( $getArgument(EePlayer.UrlParam.mediaUrl, this.get_mediaUrl() ) );
        this.set_muted( $getArgument(EePlayer.UrlParam.muted, this.get_muted().toString() ) === "true" );
        this.set_volume( parseFloat($getArgument(EePlayer.UrlParam.volume, this.get_volume() )) );
        this.set_timeIndex( parseFloat($getArgument(EePlayer.UrlParam.startTime, this.get_timeIndex())) );
        this.set_mediainfo( $getArgument(EePlayer.UrlParam.mediainfo, this.get_mediainfo()) );
        var chapterArg = $getArgument(EePlayer.UrlParam.chapter);
        if (chapterArg!=="") {
            this.set_currentChapter(parseInt(chapterArg));
        }

        if (this.get_mediainfo()!=="")
            this._initMediainfo();

        this._fInitialized=true;
    }




    function EePlayer$Player$set_mediainfo(mediainfo) {
        this._mediainfo = mediainfo;
        if (this._fInitialized)
            this._initMediainfo();
    }

    function EePlayer$Player$_initMediainfo() {
        // Load mediainfo from URL or is this a mediainfo JSON array or a function that returns
        if (typeof(this._mediainfo)==="string") {
            var req = new Sys.Net.WebRequest();
            req.set_url(this._mediainfo);
            req.add_completed(Function.createDelegate(this, this._loadedMediainfo));
            var executor = new Sys.Net.XMLHttpExecutor();
            req.set_executor(executor);
            executor.executeRequest();
            var started = executor.get_started();
        }
        else if (typeof(this._mediainfo)==="function") {
            this.set_chapters( this._mediainfo().chapters );
            this.set_placeholderImage( this._mediainfo().placeholderImage );
            this.set_mediaUrl( this._mediainfo().mediaUrl );
        }
        else if (this._mediainfo.mediaUrl!=null) {
            this.set_chapters( this._mediainfo.chapters );
            this.set_placeholderImage( this._mediainfo.placeholderImage );
            this.set_mediaUrl( this._mediainfo.mediaUrl );
        }
        else {
            throw Error.invalidOperation("unknown type for mediainfo");
        }
    }

    function EePlayer$Player$_loadedMediainfo(executor, eventArgs) {
        if (executor.get_statusText()==="OK") {
            try {
                eval("("+executor.get_responseData()+")");
                var mediainfoJSON = mediainfo(); // call to your provided function...
                this.set_chapters( mediainfoJSON.chapters );
                this.set_placeholderImage( mediainfoJSON.placeholderImage );
                this.set_mediaUrl( mediainfoJSON.mediaUrl );
            } catch (e) {
                throw Error.invalidOperation("problem with mediainfo");
            }
        }
    }


    function EePlayer$Player$set_timeIndex(value) {
	    // check for skipping past end of file and raise media ended
        if(this._mediaElement && this._canSeek && value>this._naturalduration ) {
		this._raiseEvent("mediaEnded", Sys.EventArgs.Empty);
	}
	else {
		EePlayer.Player.callBaseMethod(this, 'set_timeIndex', [value]);
	}
    }
EePlayer.Player.prototype =  {
    initialize: EePlayer$Player$initialize,

    get_mediainfo: function () {
        return this._mediainfo;
    },
    set_mediainfo: EePlayer$Player$set_mediainfo,

    _initMediainfo: EePlayer$Player$_initMediainfo,

    _loadedMediainfo: EePlayer$Player$_loadedMediainfo,


    set_timeIndex: EePlayer$Player$set_timeIndex
}
EePlayer.Player._playerCount = 0;
EePlayer.Player._getUniqueName = function EePlayer$Player$_getUniqueName(baseName) {
    return baseName + EePlayer.Player._playerCount++;
}
EePlayer.Player.registerClass('EePlayer.Player', Ee.UI.Xaml.Media.Player);



function $getArgument(strArg, defVal) {
   var urlArgs=window.location.search.substring(1);
   var vals = urlArgs.split("&");
   var strArgLower = strArg.toLowerCase();
   for (var i=0;i<vals.length;i++) {
        var nvPair = vals[i].split("=");
        if (nvPair[0].toLowerCase() === strArgLower) {
            return unescape(nvPair[1]);
        }
   }
   if (typeof(defVal)!=='undefined') {
        return defVal;
   }
   return "";
}

// playerstrings

Ee.UI.Xaml.Res={
'runtimeErrorWithoutPosition': "Runtime error {2} in control '{0}', method {6}: {3}",
'scaleModeRequiresScaleTransform': "When ScaleMode is set to zoom or stretch, the root Canvas must have not have a RenderTransform applied, or must only have a ScaleTransform.",
'mediaError_NotFound': "Media '{3}' in control '{0}' could not be found.",
'runtimeErrorWithPosition': "Runtime error {2} in control '{0}', method {6} (line {4}, col {5}): {3}",
'silverlightVersionFormat': "Must be in the format 'MajorVersion.MinorVersion'.",
'otherError': "{1} error #{2} in control '{0}': {3}",
'cannotChangeXamlSource': "You cannot change the XAML source after initialization.",
'parserError': "Invalid XAML for control '{0}'. [{7}] (line {4}, col {5}): {3}"
};

Ee.UI.Xaml.Media.Res={
'volumeRange':  "Volume must be a number greater than or equal to 0 and less than or equal to 1.",
'mediaFailed':  "Unable to load media '{0}'.",
'noMediaElement':  "The XAML document does not contain a Media Element.",
'invalidChapterIndex':  "Must be greater than or equal to 0 and less than the length of the chapter's array."
};

// player

///////////////////////////////////////////////////////////////////////////////
//
//  ExtendedPlayer
//
//  This extends the base player class, you may override the base player
//  member functions or add additional player functionality here. Here 
//  we show a volume slider if you hover near the mute audio button.
//
///////////////////////////////////////////////////////////////////////////////
Type.registerNamespace('ExtendedPlayer');

ExtendedPlayer.Player = function(domElement)
{
    ExtendedPlayer.Player.initializeBase(this, [domElement]);    
}

ExtendedPlayer.Player.prototype =  {
    xamlInitialize: function() {    
        ExtendedPlayer.Player.callBaseMethod(this, 'xamlInitialize');    
        this._hoverVolumeControl = new ExtendedPlayer.MouseOverControl(this.get_element(), "VolumeControl");
    },

    xamlDispose: function() {
		if (this._hoverVolumeControl) this._hoverVolumeControl.dispose();
		this._hoverVolumeControl = null;
		ExtendedPlayer.Player.callBaseMethod(this, 'xamlDispose');    				
    },
    
    onMarkerReached: function(args) { 
        var marker = args.get_marker(); 
        var type = marker.type ? marker.type.toLowerCase() : ""; 
        //window.status = "MarkerType="+type+ " Text="+marker.text; 
        ExtendedPlayer.Player.callBaseMethod(this, "onMarkerReached", [args]); 
    }
    
   
}
ExtendedPlayer.Player.registerClass('ExtendedPlayer.Player', EePlayer.Player);

ExtendedPlayer.MouseOverControl = function(host, nameElement) {
    // plays animations on mouse enter/leave
    this._element = host.content.findName(nameElement);
    this._t1 = this._element.addEventListener("mouseEnter", Function.createDelegate(this, this._mouseEnter));
    this._t2 = this._element.addEventListener("mouseLeave", Function.createDelegate(this, this._mouseLeave));
    this._enter = host.content.findName(nameElement + "_MouseEnter");
    this._leave = host.content.findName(nameElement + "_MouseLeave");
}
ExtendedPlayer.MouseOverControl.prototype = {
    dispose: function() {
        this._element.removeEventListener("mouseEnter", this._t1);
        this._element.removeEventListener("mouseLeave", this._t2);
        this._enter = null;
        this._leave = null;
        this._element = null;
    },
    _mouseEnter: function() {
        if (this._element.Opacity == 0) {
            this._enter.begin();
        }
        
    },
    _mouseLeave: function() {
        this._leave.begin();
    }
   
}
ExtendedPlayer.MouseOverControl.registerClass("ExtendedPlayer.MouseOverControl");

// xmlloader
var chapters;
var subArray = [];
var supArray = [];
var mediaElements = [];
var silverLightControl;
var _mPlayer;
var _control;
var activeLoader; 
//RYDDE OPP HE
function loadMainXML(sender, control, url, mplayer){
    silverLightControl = sender;
    _control = control;
    _mPlayer = mplayer;
    activeLoader = "main";
    var downloader = control.createObject("downloader");
   
    downloader.addEventListener("downloadProgressChanged", downloadProgressChanged);
    downloader.addEventListener("downloadFailed", downloadFailed);
    downloader.addEventListener("completed", completed);
   
    downloader.open("GET", url);
    downloader.send();
}

function loadSubtitle(url) {
    if (url.length > 3) {
        activeLoader = "sub";
        var subDownloader = _control.createObject("downloader");
        subDownloader.addEventListener("downloadProgressChanged", downloadProgressChanged);
        subDownloader.addEventListener("downloadFailed", downloadFailed);
        subDownloader.addEventListener("completed", completed);
        subDownloader.open("GET", url);
        //subDownloader.open("GET", "xml/subtitles.xml");
        //subDownloader.open("GET", "http://10.130.1.127/nrk/Player/v01/NRKPlayer%20v.1/xml/subtitles.xml");
        
        subDownloader.Send();
    } else {
        // no subtitles xml
        loadSupring(mediaElements[silverLightControl._currentMediainfo].supURL);
    }
}
  
function loadSupring(url) {
    if (url.length > 3) {
        activeLoader = "sup";
        var supDownloader = _control.createObject("downloader");
        supDownloader.addEventListener("downloadProgressChanged", downloadProgressChanged);
        supDownloader.addEventListener("downloadFailed", downloadFailed);
        supDownloader.addEventListener("completed", completed);
        
        supDownloader.open("GET", url);
        //supDownloader.open("GET", "xml/supring.xml");
        //supDownloader.open("GET", "http://10.130.1.127/nrk/Player/v01/NRKPlayer%20v.1/xml/supring.xml");
        supDownloader.Send();
    } else {
        //no supring xml
    }
}

function downloadProgressChanged(sender, eventArgs){
    // update progress
}

function downloadFailed(sender, eventArgs){
    // show error
	//alert(eventArgs);
}

function completed(sender, eventArgs){
    var xml = sender.responseText;
    var xmlDoc;
    if (window.ActiveXObject) {
        // IE 6 (and 7)
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        if (!xmlDoc.loadXML(xml)){
            throw xmlDoc.parseError.reason;
        }
    }
    else if (!window.ActiveXObject){
        //Firefox and others
        var parser = new DOMParser();
        xmlDoc = parser.parseFromString(xml, "text/xml");
        
    } else {
    }
   
    switch(activeLoader) {
        case "main":
            parse(xmlDoc);
            break;
        case "sub":
            parseSub(xmlDoc);
            break;
        case "sup":
            parseSup(xmlDoc);
            break;
    }
}



function parseSub(xml) {
    var items = xml.getElementsByTagName("item");
    for (var i = 0; i < items.length; i++) {
        var sub_title = xml.getElementsByTagName("item")[i].attributes[0].nodeValue;
        var sub_time = xml.getElementsByTagName("item")[i].attributes[1].nodeValue;
        var sub_t = fixTime(sub_time);
        var sub_xaml = '<TimelineMarker Time="' + sub_t + '" Type="Subtitle" Text="' + sub_title.replace(/"/g,'') + '" />';
        var sub_marker = _mPlayer.getHost().content.createFromXaml(sub_xaml);
        _mPlayer.markers.add(sub_marker);
   }
   //loadSupring(mediaElements[currentNumber].supURL);
   loadSupring(mediaElements[silverLightControl._currentMediainfo].supURL);
}



function parseSup(xml) {
    var items = xml.getElementsByTagName("item");
    for (var i = 0; i < items.length; i++) {
        var sup_title = xml.getElementsByTagName("item")[i].attributes[0].nodeValue;
        var sup_time = xml.getElementsByTagName("item")[i].attributes[1].nodeValue;
        var sup_t = fixTime(sup_time);
        var sup_xaml = '<TimelineMarker Time="' + sup_t + '" Type="Supring" Text="' + sup_title.replace(/"/g,'') + '" />';
        var sup_marker = _mPlayer.getHost().content.createFromXaml(sup_xaml);
    	_mPlayer.markers.add(sup_marker);
   }
}

//INIT
function parse(xml){
   var items = xml.getElementsByTagName("mediaitem");
   for (var i = 0; i < items.length; i++) {
        var mediaTitle;
        var mediaDesc;
        var mediaBroadcast;
        var mediaURL;
        var mediaIMG;
        var subtitleURL;
        var supringURL;
        var timeindex;
        
        if (xml.getElementsByTagName('title')[i].firstChild != null) {        
            mediaTitle = xml.getElementsByTagName('title')[i].firstChild.nodeValue;
        } else {
            mediaTitle = "";
        }
        
        if (xml.getElementsByTagName('description')[i].firstChild != null) {
            mediaDesc = xml.getElementsByTagName('description')[i].firstChild.nodeValue;
        } else {
            mediaDesc = "";
        }
        
        if (xml.getElementsByTagName('broadcasttype')[i].firstChild != null) {
            mediaBroadcast = xml.getElementsByTagName('broadcasttype')[i].firstChild.nodeValue;
        } else {
            mediaBroadcast = "";
        }            
        
        if (xml.getElementsByTagName('mediaurl')[i].firstChild != null) {
            mediaURL = xml.getElementsByTagName('mediaurl')[i].firstChild.nodeValue;
        } else {
            mediaURL = "";
        }
        
        if (xml.getElementsByTagName('imageurl')[i].firstChild != null) {
            mediaIMG = xml.getElementsByTagName('imageurl')[i].firstChild.nodeValue;
        } else {
            mediaIMG = "";
        }
        
        if (xml.getElementsByTagName('subtitleurl')[i].firstChild != null) {
            subtitleURL = xml.getElementsByTagName('subtitleurl')[i].firstChild.nodeValue;
        } else {
            subtitleURL = "";
        }   
         
        if (xml.getElementsByTagName('supringurl')[i].firstChild != null) {
            supringURL = xml.getElementsByTagName('supringurl')[i].firstChild.nodeValue;
        } else {
            supringURL = "";
        }
        
        if (xml.getElementsByTagName('timeindex')[i].firstChild != null) {
            timeindex = xml.getElementsByTagName('timeindex')[i].firstChild.nodeValue;
        } else {
            timeindex = "";
        }       
        
        var chapters_items = xml.getElementsByTagName("chapters")[i].getElementsByTagName("chapteritem");
        var chapters = new Array();        
        var chapterTitle;
        var chapterTimeIndex;
        var chapterImageURL;
        
        for (var j = 0; j < chapters_items.length; j++)
        {
            if (xml.getElementsByTagName("chapters")[i].getElementsByTagName('title')[j].firstChild != null) {
                chapterTitle = xml.getElementsByTagName("chapters")[i].getElementsByTagName('title')[j].firstChild.nodeValue;
            } else {
                chapterTitle = "";
            }
            
            if (xml.getElementsByTagName("chapters")[i].getElementsByTagName('timeindex')[j].firstChild != null) {
                chapterTimeIndex = xml.getElementsByTagName("chapters")[i].getElementsByTagName('timeindex')[j].firstChild.nodeValue;
            } else {
                chapterTimeIndex = "";
            }
            
            if (xml.getElementsByTagName("chapters")[i].getElementsByTagName('imageurl')[j].firstChild != null) {
                chapterImageURL = xml.getElementsByTagName("chapters")[i].getElementsByTagName('imageurl')[j].firstChild.nodeValue;
            } else {
                chapterImageURL = "";
            }
            
            
            chapters.push(new chapter(chapterTitle,chapterTimeIndex,chapterImageURL));
        }
        
        var mediaName = "mediaInfo"+i.toString();
        mediaName = new mediaElement(mediaTitle, mediaBroadcast, mediaDesc, mediaURL, subtitleURL, supringURL, timeindex, chapters);
        mediaElements.push(mediaName);
        
   }
   silverLightControl.playNextVideo();
}

function subtitle(title, time) {
    this._title = title;
    this._time = time;
}

function chapter(title,timeIndex,imageUrl){   
    this.ch_title = title
    this.ch_time = timeIndex
    this.img = imageUrl
        
}


function mediaElement(title, broadcast, desc, medieURL, subURL, supURL, timeindex, chapters) {
    this.title = title;
    this.broadcast = broadcast;
    this.description = desc;
    this.medieURL = medieURL;
    this.subURL = subURL;
    this.supURL = supURL;
    this.chapters = chapters;
    this.timeindex = timeindex;
    
    
    this.getTitle = function() {
        return this.title;
    }
    
    this.getChapters = function() {
        return this.chapters;
    }
    
    this.getSubtitle = function() {
        return this.subURL;
    }
    
    this.getSupring = function() {
        return this.supURL;
    }
}



function fixTime_old(time) {
    var theTime = time;
    var min = Math.floor(theTime/60);
    if (min < 10) {
        min = "0" + min;
    }
    var sec = Math.floor(theTime%60);
    if (sec < 10){
        sec = "0" + sec;
    }
    var hour = Math.floor(min/60);
    if (hour < 10) {
        hour = "0" + hour;
    }
    return hour+":"+min+":"+sec;
 
}

function fixTime(secs) {
   var t = new Date(1970,0,1);
   t.setSeconds(secs);
   var s = t.toTimeString().substr(0,8);
   if(secs > 86399)
   s = Math.floor((t - Date.parse("1/1/70")) / 3600000) + s.substr(2);
   return s;
}


